42

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

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

生成的查询表明它从 Blog 模型中选择了所有字段。我尝试将 only() 和 defer() 与 select_related 一起使用,但都没有成功。

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

上述查询导致错误:在 select_related 中给出的字段名称无效:选择是:博客

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

4

3 回答 3

60

select_related应该在整个模型上使用,然后您可以对其进行更多过滤。这将起作用:

Articles.objects.select_related('blog').only('blog__name', 'title', 'create_time')
于 2016-02-20T18:44:21.683 回答
23

您可以为此使用annotate()

>>> a = Articles.objects.annotate(blog_name=F('blog__name')).first()
>>> a.title
>>> a.blog_name
于 2016-08-11T10:37:25.727 回答
0

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

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

在 Django==2.2.19 上测试

于 2021-05-21T19:38:50.767 回答