from django.db.models.functions import Concat
from django.db.models import F, Value, CharField
AnyModel.objects.filter(**kwargs).annotate(full_name=Concat(F('model__user_first_name'), Value(' '), F('model__user_last_name'), output_field=CharField()))
其中,F('...')将其参数计算为查询,因此您可以查询模型本身的字段,或者像在filter/get中那样跨模型进行查询,而Value('...')则按字面意义计算其参数(在我的例子中,我需要在first_name和last_name之间放置一个空间),output_field=...指定了带注解字段的类型(我想成为CharField)。要了解更多信息,可以阅读Django docs about Concat
from django.db.models.functions import Concat
from django.db.models import Value
MyModel.objects.filter(**kwargs).update(my_field=Concat('my_other_field', Value('a string'))
3条答案
按热度按时间b91juud31#
我也有类似的问题基本上我想连接两个字段来获取用户的全名。我用这种方法解决了这个问题(但必须说我使用的是Postgres):
其中,
F('...')
将其参数计算为查询,因此您可以查询模型本身的字段,或者像在filter/get中那样跨模型进行查询,而Value('...')
则按字面意义计算其参数(在我的例子中,我需要在first_name
和last_name
之间放置一个空间),output_field=...
指定了带注解字段的类型(我想成为CharField
)。要了解更多信息,可以阅读Django docs about Concattkclm6bt2#
Django将'+'传递给SQL,但SQL不允许使用'+'进行连接,所以它会尝试用数字相加。如果你用整数代替'字符串',它会将整数值
my_other_field
加到你的变量中。这是否是一个bug是有争议的。查找查询中
F()
对象的文档声明:Django支持对
F()
对象使用加、减、乘、除和模运算所以你不应该尝试用它来更新字符串。但是这肯定没有记录在案,错误消息'不正确的DOUBLE值'也不是很有帮助。我会开一个罚单。
dwbf0jvd3#
您可以使用 Concat 函数https://docs.djangoproject.com/en/1.9/ref/models/database-functions/#concat