我在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属性而不多次访问数据库?
答案 0 :(得分:0)
看起来你想要玩prefetch_related。我想你需要做的是打电话:
Comment.objects.prefetch_related('post__comments').all()
这应该会给你一个更大的查询,带有一些连接,而不是很多小的查询。我花了一段时间试验这些以使它们正确,所以我建议你做同样的事情以获得正确的平衡。