【发布时间】:2016-06-02 03:28:49
【问题描述】:
我有两个模型文章和博客使用外键相关。我想在提取文章时只选择博客名称。
articles = Articles.objects.all().select_related('blog__name')
生成的查询表明它选择了博客模型中的所有字段。 我尝试将 only() 和 defer() 与 select_related 一起使用,但都没有成功。
articles = Articles.objects.all().select_related('blog__name').only('blog__name', 'title', 'create_time')
上述查询导致错误:select_related 中给出的字段名称无效:选项为:博客
如何生成查询以便只选择文章字段和博客名称?
【问题讨论】:
-
我认为这不可能——
only的文档没有显示任何遍历关系的示例,而select_related的文档仅显示了遍历多个关系的示例(即@987654325 @,而不是rel__field)。似乎你能做的最好的就是articles = Articles.objects.all().select_related('blog').only('blog', 'title', 'create_time') -
这样做的目的是什么?性能优化?但是,您可以使用
prefetch_related进行此操作,但这样您最终会得到 2 个查询而不是 1 个。Articles.objects.all().prefetch_related(Prefetch('blog', queryset=Blog.objects.all().only('name'))) -
唯一的目的是优化性能。我已经在使用 select_related,但它提供了所有消耗大量内存的属性。有没有其他方法可以做到这一点?
-
截至目前,对于 django 1.8.9,我无法找到将 'defer' 或 'only' 与 'select_related' 或任何类似返回查询集的解决方案。
标签: django python-2.7 django-queryset django-1.8 django-select-related