在Django中获取彼此相邻的两个对象

时间:2012-03-07 18:06:04

标签: python 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 个答案:

答案 0 :(得分:1)

解决你的循环依赖:

问题是:当您在讨论中FK时,尚未声明DiscussionPost。 将尚未声明的模型的名称放在引号中。

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

请参阅:https://stackoverflow.com/a/9606701/884453