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

时间:2012-05-15 10:37:10

标签: django django-orm

我想在this ticket at 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}]

是否有其他更内置的方法,还是我必须手动执行此操作?

5 个答案:

答案 0 :(得分:137)

django>=1.8您可以使用注释和F对象

from django.db.models import F

MyModel.objects.annotate(renamed_value=F('cryptic_value_name')).values('renamed_value')

extra()

也将弃用com.pnpjunction.thefloorplan.serviceimpl
  

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

答案 1 :(得分:58)

有点hacky,但您可以使用extra方法:

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

这基本上是SQL中的SELECT cryptic_value_name AS renamed_value

另一个选项,如果您总是希望重命名的版本但数据库具有隐藏名称,则使用新名称命名您的字段,但使用db_column来引用数据库中的原始名称。

答案 2 :(得分:37)

不使用任何其他经理方法(在v2.0.8上测试):

from django.db.models import F

MyModel.objects.values(renamed_value=F('cryptic_value_name'))

答案 3 :(得分:0)

我正在使用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()与上面相同。

答案 4 :(得分:-4)

如果你想重命名模式的几个字段,那就简单了。

尝试

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

这里我没有表中的name字段,但我可以稍微调整后得到它。