Я создаю приложение Django, с форумоподобной штукой. В одной из представлений должен отображаться список обсуждений с последним письменным сообщением рядом с ним.Извлеките два объекта рядом друг с другом в 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()
Но это делает циклическую зависимость, а просто не скомпилируется ,
Кто-нибудь знает способ решить эту проблему? Это кажется простым, но я застрял ...
Спасибо за вашу помощь :) После того, как вы написали, я нашел что-то на Джанго документации [ссылка] (https://docs.djangoproject.com/en/dev/ref/ Модели/поле/# рекурсивные-отношения). – Bugari