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

Zac*_*ach 33 python mysql django

我想通过ORM运行django更新,看起来像这样:

MyModel.objects.filter(**kwargs).update(my_field=F('my_other_field')+'a string')
Run Code Online (Sandbox Code Playgroud)

这会导致MySQL抛出异常.反正有没有编写原始SQL吗?

tom*_*p83 70

我有类似的问题; 基本上我想连接两个字段来获取用户的全名.我用这种方式解决了(但必须说我使用的是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()))
Run Code Online (Sandbox Code Playgroud)

其中,F('...')将其参数作为查询进行评估,因此您可以像在filter/get中那样查询模型本身的字段,或跨模型,而Value('...')从字面上评估它的参数(在我的例子中,我需要在first_name和last_name之间放置一个空格),而output_field = ...指定注释字段的类型(我想成为CharField).有关更多信息,您可以阅读有关Concat的Django文档

希望它对那里的人有所帮助.干杯

  • 正是我的用例! (2认同)

Dan*_*man 32

发生的事情是Django将'+'传递给SQL - 但SQL不允许使用'+'进行连接,因此它尝试以数字方式添加.如果使用整数代替'a string',它确实起作用,它将整数值添加my_other_field到变量中.

这是否是一个bug是有争议的.查询查询中对象文档F()说明:

Django支持与使用加法,减法,乘法,除法和模运算的F()对象

所以可以说你不应该试图用它来更新字符串.但这肯定没有记录,错误消息'不正确的DOUBLE值'不是很有帮助.我会打开一张票.


Ale*_*zin 20

您可以使用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'))
Run Code Online (Sandbox Code Playgroud)