我想运行通过ORM,看起来像这样的Django的更新:我可以在字符串连接中使用Django F()对象吗?
MyModel.objects.filter(**kwargs).update(my_field=F('my_other_field')+'a string')
这导致MySQL抛出异常。无论如何没有写入原始SQL来做到这一点?
我想运行通过ORM,看起来像这样的Django的更新:我可以在字符串连接中使用Django F()对象吗?
MyModel.objects.filter(**kwargs).update(my_field=F('my_other_field')+'a string')
这导致MySQL抛出异常。无论如何没有写入原始SQL来做到这一点?
发生了什么是Django正在将'+'传递给SQL - 但SQL不允许使用'+'进行连接,所以它会尝试添加数字。如果你用一个整数来代替'一个字符串',它的确可以工作,因为它将整数值my_other_field
添加到你的变量中。
这是一个错误是值得商榷的。在查找查询的documentation for F()
objects指出:
Django支持与
F()
对象
,因此可以说,你不应该试图运用加,减,乘,除和模运算用它来更新字符串。但是这当然没有记录,并且错误消息“不正确的DOUBLE值”不是很有帮助。我会打开一张票。
您可以使用的毗连功能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'))
我有一个类似的问题;基本上我想连接两个字段来获取用户的全名。我把它解决了这个办法(但必须说,我使用的是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
希望这将有助于有人在那里。干杯
这是一个很好的答案,按预期工作。 – ihhcarus 2016-10-08 13:09:12
这是一个很好的答案,按预期工作。 – 2017-09-11 21:18:31
感谢您的详细回复 – Zach 2010-07-22 02:23:59
在SQLite中它甚至没有什么帮助:它只是将文本设置为“0”! – boxed 2015-02-05 13:15:18