在Django中使用select_related选择特定字段

时间:2016-02-20 13:57:28

标签: django python-2.7 django-queryset django-1.8 django-select-related

我使用外键有两个模型文章和博客相关。我想在提取文章时只选择博客名称。

articles = Articles.objects.all().select_related('blog__name')

生成的查询显示它选择了Blog模型中的所有字段。 我尝试使用select()和defer()和select_related,但两者都没有用完。

articles = Articles.objects.all().select_related('blog__name').only('blog__name', 'title', 'create_time')

以上查询导致错误:select_related中提供的字段名称无效:选项包括:博客

如何生成查询以便仅选择文章字段和博客名称?

3 个答案:

答案 0 :(得分:19)

您可以使用annotate()

>>> a = Articles.objects.annotate(blog_name=F('blog__name')).first()
>>> a.title
>>> a.blog_name

答案 1 :(得分:12)

应该在整个模型上使用

select_related,然后您可以对其进行更多过滤。这将有效:

Articles.objects.select_related('blog').only('blog__name', 'title', 'create_time')

答案 2 :(得分:0)

可以通过在 only 部分中再添加一个字段来完成,它是 blog(我认为它有助于 Django 保持对象之间的关系(文章和博客):

articles = Articles.objects.select_related(
    'blog',
).only(
    'blog',
    'blog__name',
    'title',
    'create_time',
)

在 Django==2.2.19 上测试