151

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

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

4

6 回答 6

244

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.extra 关键字提交票证(请先检查现有票证列表),以便我们可以增强 QuerySet API 以允许删除 extra()。我们不再改进或修复此方法的错误。

于 2015-09-15T08:14:11.860 回答
127

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

from django.db.models import F

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

摘自Django 文档

F()对象表示模型字段或注释列的值。它可以引用模型字段值并使用它们执行数据库操作,而无需将它们从数据库中拉出到 Python 内存中。

于 2017-10-13T11:55:27.453 回答
80

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

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

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

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

于 2012-05-15T10:45:04.410 回答
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

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

于 2017-10-24T17:44:10.350 回答
0

尝试作为 kwargs 传递:

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

在我的情况下,结果集中每个值的键中都包含空格和其他特殊字符,所以这起到了作用。

于 2021-09-24T20:06:37.827 回答
-6

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

尝试

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

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

于 2014-07-21T11:42:14.763 回答