在Django QuerySet.values调用中别名字典键

5 投票
1 回答
5255 浏览
提问于 2025-04-18 18:02
>>> ppcs.values('price', 'currency__currency_code')
[{'price': Decimal('562.00'), 'currency__currency_code': u'JPY'}]

在使用 QuerySet.values 的时候,有没有办法把键名改成其他的名字?比如说,我不想让输出显示 currency__currency_code 这样的内容,而是想让字典的键叫做 'currency',就像下面的输出那样:

>>> 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,就像第一个例子那样。

1 个回答

6

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 1.7或更早的版本中,这是不可能实现的。

我本来更喜欢在这个问题中最初建议的语法,这样就不需要导入那个笨重的F对象,但没办法。

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

撰写回答