Принесите два объекта рядом друг с другом в Джанго - PullRequest
2 голосов
/ 07 марта 2012

Я создаю приложение 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()

Но это создает циклическую зависимость и просто не компилируется.

Кто-нибудь знает способ решения этой проблемы? Это кажется легким, но я застрял ...

1 Ответ

1 голос
/ 07 марта 2012

Чтобы решить круговую зависимость:

Проблема в том, что ОбсуждениеПост еще не был объявлен, когда вы FK его обсуждали.введите название модели, которая еще не была объявлена ​​в кавычках.

models.ForeignKey('DiscussionPost', null=True)

см .: https://stackoverflow.com/a/9606701/884453

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...