加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

django – 如何重命名带注释的查询的字段?

发布时间:2020-12-20 11:28:54 所属栏目:Python 来源:网络整理
导读:我有以下查询 a = Mainfee.objects.values('collected_by__username'). distinct().annotate(Sum('amount')) 结果看起来像这样 [{'collected_by__username': u'maindesk','amount__sum': 800}] 如何将第一个键重命名为b,将第二个键重命名为b? 我尝试了以下
我有以下查询

a = Mainfee.objects.values('collected_by__username').
                       distinct().annotate(Sum('amount'))

结果看起来像这样

[{'collected_by__username': u'maindesk','amount__sum': 800}]

如何将第一个键重命名为b,将第二个键重命名为b?

我尝试了以下内容

m = Mainfee.objects.extra(select = 
   {'a':'collected_by__username'}).values('a').distinct().
    annotate(Sum('amount'))

收到了这个

DatabaseError: no such column: collected_by__username

我也试过了

m = Mainfee.objects.extra(select = 
   {'a':'collected_by__username'}).values('collected_by__username').distinct().
    annotate(Sum('amount'))

得到了

[{'collected_by__username': u'maindesk','amount__sum': 800}]

PS:我也想重命名第二个字段

解决方法

您可以使用关键字参数更改带注释值的字典键:

m = Mainfee.objects.values('collected_by__username').annotate(b=Sum('amount'))

[{'collected_by__username': u'maindesk','b': 800}]

但是,没有快速简便的方法来重命名相关字段.你可以用Python转换它,但你必须问自己这是否真的有必要:

m = Mainfee.objects.values('collected_by__username').annotate(b=Sum('amount'))
m = [{'a': x['collected_by__username'],'b': x['b']} for x in m]

或者这可能稍快一点:

m = Mainfee.objects.values_list('collected_by__username').annotate(Sum('amount'))
m = [{'a': x[0],'b': x[1]} for x in m]

这两种方法当然都会强制评估整个查询集,并且不允许通过queryset的方法进一步过滤/排序等.

另请注意,当您将values()或values_list()与annotate()一起使用时,对distinct()的调用是多余的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读