具有对象属性的Django查询集正在命中数据库

时间:2015-06-03 13:17:07

标签: python django

我在Django中有一个模型,它有一个属性可以访问数据库:

class Post(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

class Comment(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    comment = models.CharField()
    post = models.ForeignKey(Post, related_name='comments')

    @property
    def previous_comment(self):
        try:
            return self.post.comments.filter(created_at__lt=self.created_at).order_by('-created_at')[0]
        except IndexError:
            return None

但是当我使用Comment.objects.all()获取所有评论对象时,显然每次将每个对象包含在查询集中以查找以前的评论时,它都会访问数据库。

我觉得我这样做的方式非常错误。如何在查询集内的每个对象中包含previous_comment属性而不多次访问数据库?

1 个答案:

答案 0 :(得分:0)

看起来你想要玩prefetch_related。我想你需要做的是打电话: Comment.objects.prefetch_related('post__comments').all() 这应该会给你一个更大的查询,带有一些连接,而不是很多小的查询。我花了一段时间试验这些以使它们正确,所以我建议你做同样的事情以获得正确的平衡。