2012-03-07 4 views
2

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

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

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

ответ

1

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

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

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

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

+0

Спасибо за вашу помощь :) После того, как вы написали, я нашел что-то на Джанго документации [ссылка] (https://docs.djangoproject.com/en/dev/ref/ Модели/поле/# рекурсивные-отношения). – Bugari