我想通过看起来像这样的 ORM 运行 django 更新:
MyModel.objects.filter(**kwargs).update(my_field=F('my_other_field')+'a string')
这会导致 MySQL 抛出异常。有没有不用编写原始 SQL 就可以做到这一点的方法?
原文由 Zach 发布,翻译遵循 CC BY-SA 4.0 许可协议
我有一个类似的问题;基本上我想连接两个字段来获取用户的全名。我以这种方式解决了它(但必须说我使用的是 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_name
和 last_name
之间放置一个空格),以及 output_field=...
指定字段的类型(我想要注释成为 CharField
)。有关更多信息,您可以阅读 有关 Concat 的 Django 文档
原文由 tombishop83 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.5k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
8 回答1.3k 阅读
3 回答1.2k 阅读✓ 已解决
发生的事情是 Django 将“+”传递给 SQL——但 SQL 不允许使用“+”进行连接,因此它会尝试以数字方式相加。如果您使用整数代替“字符串”,它确实可以将
my_other_field
的整数值添加到您的变量中。这是否是一个错误值得商榷。
F()
查找查询中的对象的文档 指出:因此可以说您不应该尝试使用它来更新字符串。但这肯定没有记录在案,错误消息“不正确的 DOUBLE 值”也不是很有帮助。我会开一张票。