python 我可以使用Django F()对象来连接字符串吗?

2hh7jdfx  于 2022-12-25  发布在  Python
关注(0)|答案(3)|浏览(116)

我想通过ORM运行一个django更新,如下所示:

MyModel.objects.filter(**kwargs).update(my_field=F('my_other_field')+'a string')

这会导致MySQL抛出异常。有没有办法在不写原始SQL的情况下完成这一操作?

b91juud3

b91juud31#

我也有类似的问题基本上我想连接两个字段来获取用户的全名。我用这种方法解决了这个问题(但必须说我使用的是Postgres):

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_namelast_name之间放置一个空间),output_field=...指定了带注解字段的类型(我想成为CharField)。要了解更多信息,可以阅读Django docs about Concat

tkclm6bt

tkclm6bt2#

Django将'+'传递给SQL,但SQL不允许使用'+'进行连接,所以它会尝试用数字相加。如果你用整数代替'字符串',它会将整数值my_other_field加到你的变量中。
这是否是一个bug是有争议的。查找查询中F()对象的文档声明:
Django支持对F()对象使用加、减、乘、除和模运算
所以你不应该尝试用它来更新字符串。但是这肯定没有记录在案,错误消息'不正确的DOUBLE值'也不是很有帮助。我会开一个罚单。

dwbf0jvd

dwbf0jvd3#

您可以使用 Concat 函数https://docs.djangoproject.com/en/1.9/ref/models/database-functions/#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'))

相关问题