如何在django查询集中为列名写别名?对于两个链接到同一个外部模型的字段的联合样式组合(例如)很有用。例如在mysql中:
select m as n, b as a from xyz
我怎么能在Django查询设置中做到这一点?
models.Table.objects.all().values('m', 'b')
任何帮助都非常感谢。
whitzsjs1#
您可以使用F表达式根据需要对字段进行注解:
from django.db.models import F models.Table.objects.all().values('m', 'b').annotate(n=F('m'), a=F('b'))
laximzn52#
虽然这在以前可以通过使用extra(select={'n':'m','a':'b'})来完成,但我同意这确实应该是values()本身的一部分。为了达到这个目的,受Alex的启发,我刚刚发布了一个添加了这个特性的patch。我希望你会发现它很有用!
extra(select={'n':'m','a':'b'})
values()
tp5buhyn3#
您在注解中的理由没有意义。模型中的每个字段在数据库中都有自己的数据行,而且永远不会有混淆的危险。您当然可以告诉字段使用与字段名称不同的数据行名称:
myfield = models.CharField(max_length=10, db_column='differentname')
但我不知道这对你有没有帮助,因为我还是不知道你问题是什么。
vlju58qv4#
我认为这是不可能的,所以我已经提出了一个票的功能被添加,我认为有一些优点,能够做到这一点。请查看票的更多信息。https://code.djangoproject.com/ticket/16735
wb1gzix05#
您也可以在查询集中使用.alias()。
第一个对于您的特定情况,这将是答案
models.Table.objects.all().alias( n=F('m'), a=F('b')).values('m', 'a') )
ia2d9nvy6#
我真的不明白你想做什么,但是听起来你想找的是额外的queryset方法。这在大多数情况下的作用方式与sql中的AS相同。
6条答案
按热度按时间whitzsjs1#
您可以使用F表达式根据需要对字段进行注解:
laximzn52#
虽然这在以前可以通过使用
extra(select={'n':'m','a':'b'})
来完成,但我同意这确实应该是values()
本身的一部分。为了达到这个目的,受Alex的启发,我刚刚发布了一个添加了这个特性的patch。我希望你会发现它很有用!
tp5buhyn3#
您在注解中的理由没有意义。模型中的每个字段在数据库中都有自己的数据行,而且永远不会有混淆的危险。您当然可以告诉字段使用与字段名称不同的数据行名称:
但我不知道这对你有没有帮助,因为我还是不知道你问题是什么。
vlju58qv4#
我认为这是不可能的,所以我已经提出了一个票的功能被添加,我认为有一些优点,能够做到这一点。请查看票的更多信息。
https://code.djangoproject.com/ticket/16735
wb1gzix05#
您也可以在查询集中使用.alias()。
第一个
对于您的特定情况,这将是答案
ia2d9nvy6#
我真的不明白你想做什么,但是听起来你想找的是额外的queryset方法。这在大多数情况下的作用方式与sql中的AS相同。