Я создаю приложение Django, с форумной штуковиной. В одном из представлений должен отображаться список обсуждений с последним письменным сообщением рядом с ним.
class Discussion(models.Model):
<snip>
topic = models.CharField(max_length=512)
class DiscussionPost(models.Model):
<snip>
target = models.ForeignKey(Discussion)
author = models.ForeignKey(User)
content = models.TextField(max_length=16000)
creation_date = models.DateTimeField(auto_now_add=True)
При стандартных запросах Django мне пришлось бы получать ~ 50 раз на страницу (по одному на каждое обсуждение).
DiscussionPost.objects
.filter(target=some_discussion)
.annotate(last_post=Max('creation_date'))
.filter(creation_date=F('last_post'))
Я попытался обойти это, добавив поле last_post = models.ForeignKey(DiscussionPost, null=True)
к обсуждению и изменив метод сохранения в DiscussionPost следующим образом:
def save(self, *args, **kwargs):
if self.pk == None:
i_am_new = True
else:
i_am_new = False
super(DiscussionPost, self).save(*args, **kwargs)
if i_am_new:
self.target.last_post=self
self.target.save()
Но это создает циклическую зависимость и просто не компилируется.
Кто-нибудь знает способ решения этой проблемы? Это кажется легким, но я застрял ...