【问题标题】:Django efficient Queryset with Foreign Key Models具有外键模型的 Django 高效查询集
【发布时间】:2019-01-19 17:48:54
【问题描述】:

我正在尝试为以下模型结构找到最有效的方法(尽可能少的数据库查询)。

然后我想在我的模板中传递来自所有 3 个模型的所有数据,因为我必须显示发布数据以及遍历 cmets 以创建 cmets 列表并显示不同 cmets 的所有附件。

class Post(BaseModel):
    user = models.ForeignKey('User', blank=True, null=True, 
    title = models.CharField(max_length=128)
    content = models.TextField()


class Comment(BaseModel):
    post = models.ForeignKey('Post', on_delete=models.CASCADE)
    user = models.ForeignKey('User', on_delete=models.SET_NULL)
    text = models.TextField()


class CommentAttachment(BaseModel):
    comment = models.ForeignKey('Comment', on_delete=models.CASCADE)
    name = models.CharField(max_length=128)

我应该从CommentAttachment 方向获取所有数据(意思是获取所有CommentAttachments,其中comment__post__id 是帖子ID,然后使用select_related 获取所有其他数据)还是有其他方法可以从@987654326 开始@模特?

【问题讨论】:

  • “从 CommentAttachment 方向获取所有数据”我不清楚。你试过什么了 ?如果您可以粘贴当前的视图代码或至少是伪代码,将会有所帮助。

标签: python django django-queryset


【解决方案1】:

您可以在查询中使用prefetch_related 或select_related:

posts = Post.objects.filter(user=some_user).prefetch_related(
    'comment_set', 'comment_set__commentattachment_set'
)

例如,在进行上述查询后,以下命令可能会在不进行 SQL 查询的情况下检索查询集中第一个帖子的所有 cmets:

posts.first().comment_set.all()

【讨论】:

  • 感谢您的快速回答,看来这对我来说应该很好用。但我有最后一个问题:我怎样才能获得所有的评论附件?我试过posts.first().comment_set__commentattachment_set.all(),但不幸的是这不起作用。或者甚至可以循环遍历模板中的CommentAttachments,因为它现在应该附加到Comment?
  • @Paul 你可以遍历 cmets 并通过类似my_comment.objects.commentattachment_set.all()的查询检索附件
  • 首先感谢您的快速回复。不幸的是,我无法让它运行。正如你提到的,我试图迭代 cmets,但它不起作用。我只能通过遍历 cmets 然后查询评论附件来运行它,但问题是我对每条评论都有一个额外的查询,这太多了:/
  • 好的,我只用my_comment.commentattachment_set.all() 就可以了,但也可以直接在模板中访问它吗?因为这样我必须创建一个新字典,附加所有 cmets 及其 commentattachments 才能在模板中显示它们:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 2011-02-02
  • 2015-03-09
  • 1970-01-01
相关资源
最近更新 更多