如何在Django的values()中重命名项目?

我想在djangoproject.com上的这个票上做类似的事情 ,但是有一些额外的格式。 从这个查询

>>> MyModel.objects.values('cryptic_value_name') [{'cryptic_value_name': 1}, {'cryptic_value_name': 2}] 

我想得到这样的东西:

 >>> MyModel.objects.values(renamed_value='cryptic_value_name') [{'renamed_value': 1}, {'renamed_value': 2}] 

还有另外一种内置的方法,还是我必须手动执行?

这有点怪异,但你可以使用extra方法:

 MyModel.objects.extra(select={'renamed_value': 'cryptic_value_name'}).values('renamed_value') 

这基本上在SQL中SELECT cryptic_value_name AS renamed_value

另一个选项,如果你总是想要重命名的版本,但数据库有神秘的名字,是命名你的领域与新的名字,但使用db_column引用数据库中的原始名称。

您可以使用注释和F对象

 from django.db.models import F MyModel.objects.annotate(renamed_value=F('cryptic_value_name')).values('renamed_value') 

另外extra()将被弃用,从Django的文档:

这是一个旧的API,我们打算在将来某个时候弃用。 只有在不能使用其他查询集方法表示查询时才使用它。 如果您确实需要使用它,请使用QuerySet.extra关键字和您的用例(请先查看现有工单的列表)来提交工单,以便我们可以增强QuerySet API以允许删除extra()。 我们不再改进或修复这个方法的错误。

没有使用任何其他经理方法(testingv1.11 ):

InsurerCity.objects.values(renamed_value=models.F('cryptic_value_name'))

我正在与Django 1.11.6

(而且键值对与接受的答案相反)

这是我如何使它为我的项目工作

 def json(university): address = UniversityAddress.objects.filter(university=university) address = address.extra(select={'city__state__country__name': 'country', 'city__state__name': 'state', 'city__name': 'city'}) address = address.values('country', 'state', "city", 'street', "postal_code").get() return address 

请注意,添加simultanous objects.filter()。extra()。values()与上面相同。

如果你想重命名模式的几个字段,它不仅仅是简单的。

尝试

 projects = Project.objects.filter() projects = [{'id': p.id, 'name': '%s (ID:%s)' % (p.department, p.id)} for p in projects] 

在这里,我没有name字段在表中,但我可以在调整一点点后得到。