gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:08:31 24 4
gpt4 key购买 nike

在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com