Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Django中重命名values()中的项?_Django_Django Orm - Fatal编程技术网

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

如何在Django中重命名values()中的项?,django,django-orm,Django,Django Orm,我想做的和中差不多,但是有一些额外的格式。从这个查询 >>> 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}, {'r

我想做的和中差不多,但是有一些额外的格式。从这个查询

>>> 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}]

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

这有点老套,但您可以使用以下方法:

这基本上是在SQL中选择神秘的\u值\u名称作为重命名的\u值


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

如果您想要重命名模式中的几个字段,那么这就非常简单了

尝试
在这里,我没有表中的
名称
字段,但我可以在稍微调整后得到它

django>=1.8
可以使用annotate和F object

from django.db.models import F

MyModel.objects.annotate(renamed_value=F('cryptic_value_name')).values('renamed_value')
另外,
extra()

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


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

摘录自:

F()对象表示模型字段或注释字段的值 专栏。它使参考模型字段值和 使用它们执行数据库操作,而无需实际拉动 将它们从数据库中释放到Python内存中

我正在使用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

请注意,添加同步对象.filter().extra().values()与上面相同。

显然在1.7.*您可以直接将别名作为命名参数写入
values()
。来源:-1因为
.values(支持通过\u表)
而这个黑客没有(顺便说一句,可能是想要重命名
ValuesQuerySet
dict键的最明显的用例)有人找到了通过表(.values(支持通过\u表))实现这一点的方法吗?不幸的是,此解决方案不支持
.values('foreignkeymodel\uu id','foreignkeymodel\uu name')
.Model.objects.annotate(my\u alias=F('some\uu long\uu name\uu to\uu alias')中的相关名称。票证16735中的值('my\u alias')。此答案仅适用于
django>=1.8
。查询表达式已启用
注释
以接受聚合以外的表达式。参考文献:它是有效的,但是原始问题中提出的语法不是更好吗
MyModel.objects.values(重命名为\u-value='cryptic\u-value\u-name')
MyModel.objects.values(重命名为\u-value=models.F('cryptic\u-value\u-name'))
works此答案有效,但多余。传递给
values()
的关键字参数将代表您通过
annotate()
传递(请参阅)。
MyModel.objects.values(重命名为_value=F('cryptic_value_name'))
的答案更简单、更清晰,我想-1它会计算queryset,这是一个交易中断。您可以看到
.extra(select={cryptic_value:ranamed_value})
的key:value与您可以使用的多个值的公认答案相反:
MyModel.objects.values(重命名的\u value=F('cryptic\u value\u name')、重命名的\u value2=F('cryptic\u value\u name2'))
但是如果您想更改一个值并保留另一个值怎么办?使用annotate可以:
inv.annotate(name=F('stock\u name')).values('name','price')
,但我不知道这种方法在这种情况下应该如何工作<代码>库存值(名称=F(“库存名称”),价格=F(“价格”))
->注释“价格”与model@Malte我认为没有必要把这件事复杂化。只要试试
inv.values('price',name=F(“stock\u name”))
。在python中,只能将命名参数放在未命名参数之后。
from django.db.models import F

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

MyModel.objects.values(renamed_value=F('cryptic_value_name'))
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