Django:在更新调用中对文本字段使用 F 表达式

标签 django

在 django View 中,我需要将字符串数据附加到数据库中现有文本列的末尾。例如,假设我有一个名为“ATable”的表,它有一个名为“aField”的字段。我希望能够以无竞争条件的方式将字符串附加到“aField”的末尾。最初,我有这个:

tableEntry = ATable.objects.get(id=100)
tableEntry.aField += aStringVar
tableEntry.save()

问题是,如果这是同时执行的,两者都可以获得相同的“tableEntry”,然后它们各自独立更新,最后一个“保存”的获胜,丢失另一个附加的数据。

我稍微研究了一下,发现了这个,我希望它可以工作,使用 F 表达式:
ATable.objects.filter(id=100).update(aField=F('aField') + aStringVar)

这里的问题是我得到一个 SQL 错误,说:
operator does not exist: text + unknown
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

尝试更改为“str(aStringVar)”,即使它已经是一个字符串 - 没有运气。我发现一些 django 错误报告提示类似问题,但我没有看到修复或解决方法。有什么方法可以强制转换 aStringVar 以便将其附加到 F 表达式的文本中?顺便说一句 - 还尝试了“str(F('aField')) + aStringVar”,但将 F 表达式的结果转换为字符串“(DEFAULT: )”。

最佳答案

您可以使用 Concat数据库功能。

from django.db.models import Value
from django.db.models.functions import Concat

ATable.objects.filter(id=100).update(some_field=Concat('some_field', Value('more string')))

就我而言,我正在为 facebook avatars URI 添加一个后缀,如下所示:
FACEBOOK_URI = 'graph.facebook.com'
FACEBOOK_LARGE = '?type=large'
# ...
users = User.objects.filter(Q(avatar_uri__icontains=FACEBOOK_URI) & ~Q(avatar_uri__icontains=FACEBOOK_LARGE))
users.update(avatar_uri=Concat('avatar_uri', Value(FACEBOOK_LARGE)))

我得到这样的 SQL(Django 1.9):
UPDATE `user_user` SET `avatar_uri` = CONCAT(COALESCE(`user_user`.`avatar_uri`, ''), COALESCE('?type=large', ''))
WHERE (`user_user`.`avatar_uri` LIKE '%graph.facebook.com%' AND NOT (`user_user`.`avatar_uri` LIKE '%?type=large%' AND `user_user`.`avatar_uri` IS NOT NULL))

结果是所有图像 URI 都从 http://graph.facebook.com/<fb user id>/picture 更改。至http://graph.facebook.com/<fb user id>/picture?type=large

关于Django:在更新调用中对文本字段使用 F 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8143362/

相关文章:

django - 如何序列化 API 响应(在 JSON 中)并在 Django Rest Framework 中修改和添加字段?

python - Django ORM - 不同表中行的部分匹配

django - 如何在 Django 中通过 "filter" "exists"?

django - 如何从 PyCharm 运行 south manage.py 命令?

html - Django 表单在字段前添加元素?

python - 通过 Django 的 MySQL REGEXP 查询不会返回任何内容,但 MySQL 中的查询工作得很好,有什么想法吗?

django - 在 django admin 中覆盖 "Add user" header

python - Django 装饰器获取 WSGIRequest 而不是预期的函数参数

python - 将使用 Reportlab 生成的图像保存在我的 MEDIA 文件夹中(在 Amazon S3 中)

django - 如何在详细 View 中用 slug 替换 pk