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

时间:2010-07-21 15:24:36

标签: python mysql django

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

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

这会导致MySQL抛出异常。无论如何都可以在不编写原始SQL的情况下执行此操作吗?

3 个答案:

答案 0 :(得分:53)

我有类似的问题;基本上我想连接两个字段来获取用户的全名。我用这种方式解决了(但必须说我使用的是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_name和last_name之间放置一个空格),并且 output_field = ... 指定带注释字段的类型(我想成为CharField)。 有关详细信息,请参阅Django docs about Concat

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

答案 1 :(得分:30)

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

这是否是一个bug是有争议的。查询查询中的documentation for F() objects表示:

  

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

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

答案 2 :(得分:17)

您可以使用 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'))