如何在 Django QuerySets 中编写别名?

问题描述 投票:0回答:6

如何在 Django 查询集中为列名编写别名。 对于两个链接字段到同一个外部模型(例如)的联合式组合很有用。

例如在 mysql 中:

select m as n, b as a from xyz

我怎么能在 Django 查询集中做到这一点?

models.Table.objects.all().values('m', 'b')

任何帮助真的很感激。

django django-models django-queryset
6个回答
22
投票

您可以根据需要注释字段,使用 F 表达式

from django.db.models import F

models.Table.objects.all().values('m', 'b').annotate(n=F('m'), a=F('b'))

8
投票

虽然这之前可以通过使用

extra(select={'n':'m','a':'b'})
来完成,但我同意这真的应该是
values()
本身的一部分。

为此,在亚历克斯的票的启发下,我刚发布一个添加此功能的补丁。我希望你会发现它有用!


5
投票

你在评论中的理由毫无意义。模型中的每个字段在数据库中都有自己的列,永远不会有混淆它们的危险。您当然可以告诉字段使用与字段名称不同的列名称:

myfield = models.CharField(max_length=10, db_column='differentname')

但我不知道这是否对你有帮助,因为我仍然不知道你的问题是什么。


1
投票

我假设这是不可能的,所以我已经提出了要添加的功能的票,我认为能够做到这一点有一些优点。请查看门票以获取更多信息。

https://code.djangoproject.com/ticket/16735


1
投票

您还可以在查询集中使用 .alias()。

.alias(alias=SomeExpression()).annotate(                     
    SomeOtherExpression('alias'))
.alias(alias=SomeExpression()).order_by('alias')
.alias(alias=SomeExpression()).update(field=F('alias'))

对于您的具体情况,这就是答案

models.Table.objects.all().alias(
    n=F('m'), a=F('b')).values('m', 'a')
)

0
投票

我真的不明白你想做什么,但听起来你正在寻找的是 extra 查询集方法。在大多数情况下,这与 AS 在 sql 中的行为方式相同。

© www.soinside.com 2019 - 2024. All rights reserved.