【问题标题】:Django queryset with object property that is hitting a database具有正在访问数据库的对象属性的 Django 查询集
【发布时间】:2015-06-03 13:17:06
【问题描述】:

我在 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 属性而不多次访问数据库?

【问题讨论】:

  • 你可以构建一个双向链表,外键指向nextprev

标签: python django


【解决方案1】:

您似乎想玩弄prefetch_related。我认为您需要做的是致电: Comment.objects.prefetch_related('post__comments').all() 这应该会给您一个更大的查询,其中包含一些连接,而不是很多较小的查询。我花了一些时间来试验这些以使它们正确,所以我建议您也这样做以获得正确的平衡。

【讨论】:

    猜你喜欢
    • 2021-10-26
    • 1970-01-01
    • 2021-05-22
    • 2012-12-28
    • 2021-04-19
    • 1970-01-01
    • 2011-03-04
    • 2018-04-25
    • 2015-10-08
    相关资源
    最近更新 更多