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

我想做几乎相同的 这张 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}]

还有其他更内置的方法吗,还是要我手动操作?

85533 次浏览

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

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

这基本上是在 SQL 中执行 SELECT cryptic_value_name AS renamed_value

另一种选择是,如果您总是希望重命名版本,但是 db 的名称比较隐晦,那么可以使用新名称来命名字段,但是使用 db_column来引用 db 中的原始名称。

如果您想要重命名该模式的几个字段,那么它非常简单。

试试看

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

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

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

from django.db.models import F


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

同时 extra()也将被弃用,从 姜戈文档:开始

这是一个旧的 API,我们的目标是在将来的某个时候摒弃它。只有在无法使用其他查询集方法表达查询时才使用它。如果您确实需要使用它,请使用 QuerySet.tra 关键字和您的用例(请首先检查现有的票据列表)来归档票据,这样我们就可以增强 QuerySet API 以允许删除额外()。我们不再为此方法改进或修复 bug。

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

from django.db.models import F


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

节选自 姜戈医生:

F ()对象表示模型字段或注释的值 它使得引用模型字段值和 使用它们执行数据库操作,而不需要实际提取 将它们从数据库转移到 Python 内存中。

我和姜戈一起工作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

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

试着假装成 kwargs:

MyModel.objects.annotate(**{'A B C':F('profile_id')}).values('A B C')

在我的例子中,结果集中的每个值的键中都包含了空格和其他特殊字符,所以这样做很有效。