如何结合 select_related() 和 value()? (2016)

Posted

技术标签:

【中文标题】如何结合 select_related() 和 value()? (2016)【英文标题】:How to combine select_related() and value()? (2016) 【发布时间】:2016-06-06 07:49:01 【问题描述】:

我再次问这个问题(it was asked back in 2009),

我们知道QuerySet有一个values()方法,当有一个 外键(例如作者),结果如下:

[ 'author_id':3, ... , ...]

我想要这样的结果:

[ 'author':'name':'dave',..., ... , ...]

新版本的 Django 有什么变化吗?

我想将查询集转换成列表和字典的组合,可以吗?

然后我将把这个对象放入一个更大的对象中进行序列化。这就是我不想马上序列化它的原因。

【问题讨论】:

【参考方案1】:

您可以通过values() 访问相关字段,而无需使用select_related()(仅获取这些字段,无需后续查找):

MyModel.objects.values('author__id', 'author__name')

这将返回以下结构:

['author__id': 1, 'author__name': 'Dave', ...]

如果您需要在嵌套结构中使用它,则必须在之后对其进行转换。

请注意,对于 M2M 关系,这会为每个 M2M 关系返回一个列表条目,因此可能不是预期的效果。但是对于 OneToOne/ForeignKey 关系,它工作得很好。

编辑:对于 M2M 关系 annotate() 结合 values() 工作正常。

【讨论】:

然而,问题在于这会创建一个外连接。 AFAIK 你需要使用 select_related 创建一个内部连接,所以问题仍然存在。

以上是关于如何结合 select_related() 和 value()? (2016)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 google-appengine 和 django-nonrel 模仿“select_related”?

如何使用 select_related 获取 ManyToMany 字段值

如何使用'select_related'从相关(ForeignKey)django模型中接收并非所有字段

如何强制 Django Admin 使用 select_related?

如何在模板 Django 中使用 select_related?

使用 select_related 时,如何使用相关模型的自定义管理器?