我可以将 Django F() 对象与字符串连接一起使用吗?

新手上路,请多包涵

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

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

这会导致 MySQL 抛出异常。有没有不用编写原始 SQL 就可以做到这一点的方法?

原文由 Zach 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 391
2 个回答

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

这是否是一个错误值得商榷。 F() 查找查询中的对象的文档 指出:

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

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

原文由 Daniel Roseman 发布,翻译遵循 CC BY-SA 2.5 许可协议

我有一个类似的问题;基本上我想连接两个字段来获取用户的全名。我以这种方式解决了它(但必须说我使用的是 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('...') 将其参数评估为查询,因此您可以查询模型本身的字段,或者像在过滤器/获取中那样跨模型,而 Value('...') 评估其字面上的参数(在我的例子中,我需要在 first_namelast_name 之间放置一个空格),以及 output_field=... 指定字段的类型(我想要注释成为 CharField )。有关更多信息,您可以阅读 有关 Concat 的 Django 文档

原文由 tombishop83 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题