一尘不染

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

django

我想像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}]

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


阅读 1158

收藏
2020-03-29

共3个答案

一尘不染

这有点hacky,但是你可以使用以下extra方法:

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

这基本上是SELECT cryptic_value_name AS renamed_value在SQL中完成的。

如果你始终想要重命名的版本,但是数据库具有神秘名称,则另一种选择是使用新名称命名字段,但用于db_column引用数据库中的原始名称。

2020-03-29
一尘不染

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

from django.db.models import F

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

extra()从Django文档中也将不推荐使用:

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

2020-03-29
一尘不染

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

from django.db.models import F

MyModel.objects.values(renamed_value=F('cryptic_value_name'))
2020-03-29