如何对 django 的 queryset 里面添加一个固定值的字段???

  1. 假如我有代码如下:
from django.contrib.auth.models import User

us = User.objects.all()

# 我想要获取所有用户的 id,is_active
v1 = us.values("id", "is_active")

# 现在我想要在结果里面加入一个其他字段(原 User 里面没有),如: other='hehe'
# [{"id": 1, "is_active": True, "other": "hehe"}, ...]
v1 = us.values("id", "is_active", other="hehe")  # 这样是会报错的

那么如何实现我要的结果呢???

希望懂的人帮忙一下。

阅读 9.5k
7 个回答

我觉得这是一个XY问题.
你想要实现的效果并不应该用这是方式实现.
你如果可以把这么做的目的说出来,我相信很多人可以帮你解决.

具体能不能实现我也很感兴趣,正在研究奇淫技巧.

update:
我看了一下Django的源码,没有找到优雅的解决方案,起码没有比直接循环来的方便的.
GG.

你还是循环的加进去吧....

annotate 使用注解

新手上路,请多包涵

用annotate可以完成这个需求,类似这样
.annotate(mycolumn=Value('xxx', output_field=models.CharField()))

django orm没有提供这个功能,遍历v1,逐个添加吧。

很巧 我最近查另外一个问题的时候找到了跟这个相关的知识点, 我觉得你这个可以用sql取巧来做,
贴一下我在自己shell里跑的代码

from useraccount.models import User
sql = ''' select id, is_active,'haha' as other from useraccount_user limit 5'''
us = User.objects.raw(sql)
for u in us:
    print u.id, u.is_active,u.other
    
1 True haha
2 True haha
3 True haha
4 True haha
5 True haha
    

需要注意的是,使用raw函数select的时候必须筛选主键, 不然在实际访问字段的时候会爆

InvalidQuery: Raw query must include the primary key 

annotate就可以,以前我遇到过需要在查询集里面加一个字段,这个字段是其它字段计算出来的,因为有排序的需求。而且mysql也是有语法支持的。

新手上路,请多包涵

Author.objects.create(name="WeizhongTu", email="tuweizhong@163.com")

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏