如何结合 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?