Здравейте, имам такъв модел
def Photo(models.Model):
# Photo object fields...
def PhotoThread(models.Model):
photo = models.ForeignKey(Photo)
message = models.TextField(blank=True)
reply_to = models.ForeignKey('self', related_name='replies', null=True, blank=True)
votes = models.IntegerField()
Както можете да видите, обект Thread има поле reply_to, така че Threads могат да станат деца на други Threads.
Мога да правя неща като -
photo = Photo.objects.get(pk=1)
threads = photo.photothread_set.all()
Това ще доведе нишките до снимка, но тази система позволява отговорите също да имат отговори.
Как да премина през всички отговори и да получа отговори за тях (чак до максималния брой отговори, които имаме).
Искам да покажа това като вложен HTML списък. Също така искам да мога да подреждам всички теми и отговори по полето „гласове“.
Благодаря
Да, наличието на конструктор само за това е лош дизайн. Статичен
SetPath
метод, който може да бъде извикан само веднъж (в противен случай хвърля изключение), би изглеждал по-добър. Бихте задали пътя по време на стартиране на приложение и т.н.След това можете или да го направите
static class
, или сингълтон, ако се изисква да удовлетвори някакъв сценарий, базиран на интерфейс.Следва: вие трябва да добавите синхронизация тук! Това не е безопасно за нишки. Ако две нишки се опитат да се регистрират едновременно, бих очаквал това да се срине ужасно. Не е необходимо да е сложно; най-просто:
(но имайте предвид, че това може да доведе до някои разходи за блокиране; които могат да бъдат подобрени с по-сложен код - вижте по-долу)
Има съществуващи библиотеки за регистриране, които ще решат много повече проблеми - разделяне на файлове, async (за да спре кодът ви да бъде блокиран от IO), групиране и т.н.; защо просто не използвате един от тях? По-специално, в този момент вашият файл няма да бъде напълно затворен при излизане от приложението, не се изтрива редовно и ще държи файла заключен през повечето време. Не е добре.
- person Daniel Hepper   schedule 25.11.2010