【问题标题】:Can I use Django F() objects with string concatenation?我可以使用带有字符串连接的 Django F() 对象吗?
【发布时间】:2011-03-19 01:47:02
【问题描述】:

我想通过如下所示的 ORM 运行 django 更新:

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

这会导致 MySQL 抛出异常。有没有办法在不编写原始 SQL 的情况下做到这一点?

【问题讨论】:

标签: python mysql django


【解决方案1】:

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

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

【讨论】:

  • 正是我的用例!
  • 这应该是公认的答案,因为它提供了作者要求的解决方案
【解决方案2】:

发生的情况是 Django 将“+”传递给 SQL - 但 SQL 不允许使用“+”进行连接,因此它尝试以数字方式相加。如果您使用整数代替“字符串”,它确实可以将my_other_field 的整数值添加到您的变量中。

这是否是一个错误值得商榷。查找查询中的documentation for F() objects 状态:

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

因此可以说您不应该尝试使用它来更新字符串。但这肯定没有记录,并且错误消息“不正确的 DOUBLE 值”不是很有帮助。我去开张票。

【讨论】:

  • 感谢您的详细回复
  • 在 SQLite 中它的用处更小:它只是将文本设置为“0”!
  • 这是一个很好的答案,但它没有回答问题。使用ConcatValue 是实现所要求的最佳方式吗?
【解决方案3】:

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

【讨论】:

  • 这是正确答案,因为它专门针对原始问题中的update
猜你喜欢
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 2020-01-19
  • 2016-11-11
  • 1970-01-01
相关资源
最近更新 更多