从 Django values() 获取外键值

Posted

技术标签:

【中文标题】从 Django values() 获取外键值【英文标题】:Getting foreign key values from Django values() 【发布时间】:2020-10-10 19:32:13 【问题描述】:

我正在使用 Django 模型获取数据对象

tabledata=Entity.objects.filter(quarter=1)

使用这种方法,我可以像这样提取外键指定的对象的值

tabledata[0].creator.name

但是当我将代码更改为

tabledata=Entity.objects.filter(quarter=1).values()

我只能提取外键值,但不能提取与外键链接的对象数据的值。类似的东西

tabledata[0][creator][name]  does not work

有没有办法以这种方式提取值?

【问题讨论】:

这是使用.values() 不是一个好主意的众多原因中的一个:它侵蚀了模型的逻辑层。 【参考方案1】:

您可以像这样在.values() 中使用查找:

entities = Entity.objects.filter(quarter=1).values('creator__name')
print(entities[0]['creator__name'])

如果需要,您也可以获取其他字段:

Entity.objects.filter(quarter=1).values('creator__name', 'direct_field', 'another_direct_field')

【讨论】:

【参考方案2】:

这是使用.values() [Django-doc] 不是一个好主意的众多原因中的一个:它侵蚀了模型的逻辑层。

您可以使用.annotate(…) [Django-doc] 将名称添加到值中:

from django.db.models import F

tabledata = Entity.objects.filter(quarter=1).annotate(
    creator_name=F('creator__name')
).values()

然后它将出现在字典中的'creator_name'键下。

但使用.values() 通常只在特定用例中有用。例如,特定值或子查询中的 GROUP BY。如果你想为给定的模型生成 JSON,你应该使用序列化器。

【讨论】:

以上是关于从 Django values() 获取外键值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Django 模型在 ExtJS 网格中获取外键值而不是键?

在 django 模板中显示外键值

最初在 django 内联表单集中设置不同的外键值

如何清理 Django 孤儿外键值?

直接在视图Django中设置字段外键值

Django REST Framework 中的外键值