在 Django QuerySet.values 调用中为 dict 键起别名

Posted

技术标签:

【中文标题】在 Django QuerySet.values 调用中为 dict 键起别名【英文标题】:Aliasing the dict keys in a Django QuerySet.values call 【发布时间】:2014-10-14 22:48:40 【问题描述】:
>>> ppcs.values('price', 'currency__currency_code')
['price': Decimal('562.00'), 'currency__currency_code': u'JPY']

当使用QuerySet.values 时,有没有办法将键名别名为其他名称?例如,不是显示直通关系currency__currency_code 的输出,而是如何将dict 键称为“货币”,如下面的输出:

>>> keys = ['price', 'currency']
>>> [dict(zip(keys, v)) for v in ppcs.values_list('price', 'currency__currency_code')]
['currency': u'JPY', 'price': Decimal('562.00')]

上述想法的问题在于,在这个阶段我不想要一个列表(也不是一个生成器对象),我希望输出保持为ValuesQuerySet,就像第一个示例一样。

【问题讨论】:

code.djangoproject.com/ticket/16735 Django: rename items in values() 的可能副本 【参考方案1】:

klasske 的评论完全回答了这个问题(谢谢) --> https://code.djangoproject.com/ticket/16735

简而言之,这里是 Django 1.8+ 的解决方案:

from django.db.models import F
ppcs.annotate(currency=F('currency__currency_code')).values('price', 'currency')

不幸的是,这在 Django v1.7 或更早版本中是不可能的。

我更喜欢票证中最初建议的以下语法,并且避免需要导入那个笨重的 F 对象,但没有骰子。

ppcs.values('price', currency='currency__currency_code')

【讨论】:

以上是关于在 Django QuerySet.values 调用中为 dict 键起别名的主要内容,如果未能解决你的问题,请参考以下文章

Django QuerySet values_list 返回未知字符

Django queryset values_list 是不是返回一个列表对象?

如何使用 Django 中另一个查询集的结果过滤查询集?

Django - 使用 get_FOO_display 聚合

不是 JSON 可序列化的

[django]在windows下搭建Django的虚拟环境