在django视图中,我需要将字符串数据附加到数据库中现有文本列的末尾.因此,例如,假设我有一个名为"ATable"的表,并且它有一个名为"aField"的字段.我希望能够以无竞赛条件的方式将字符串附加到"aField"的末尾.最初,我有这个:
tableEntry = ATable.objects.get(id=100)
tableEntry.aField += aStringVar
tableEntry.save()
Run Code Online (Sandbox Code Playgroud)
问题在于,如果同时执行此操作,两者都可以获得相同的"tableEntry",则它们各自独立更新,最后一个"保存"获胜,丢失另一个附加的数据.
我对此进行了一些研究,并使用F表达式找到了这个,我希望它可以工作:
ATable.objects.filter(id=100).update(aField=F('aField') + aStringVar)
Run Code Online (Sandbox Code Playgroud)
这里的问题是,我得到一个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.
Run Code Online (Sandbox Code Playgroud)
尝试更改为"str(aStringVar)",即使它已经是一个字符串 - 没有运气..我发现一些django错误报告抱怨类似的问题,但我没有看到修复或解决方法.有没有什么方法可以转换aStringVar,以便它可以附加到F表达式的文本?BTW - 也试过"str(F('aField'))+ aStringVar"但是将F表达式的结果转换为字符串"(DEFAULT :)".
Dav*_*ili 22
您可以F通过一个简单的更改覆盖Django中的对象:
class CF(F):
ADD = '||'
Run Code Online (Sandbox Code Playgroud)
然后用CF它代替F.它将放置"||" 生成SQL时代替"+".例如,查询:
User.objects.filter(pk=100).update(email=CF('username') + '@gmail.com')
Run Code Online (Sandbox Code Playgroud)
将生成SQL:
UPDATE "auth_user" SET "email" = "auth_user"."username" || '@gmail.com'
WHERE "auth_user"."id" = 100
Run Code Online (Sandbox Code Playgroud)
Mak*_*hod 17
您可以使用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')))
Run Code Online (Sandbox Code Playgroud)
就我而言,我为facebook头像添加了一个后缀,如下所示:
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)))
Run Code Online (Sandbox Code Playgroud)
我得到这样的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))
Run Code Online (Sandbox Code Playgroud)
结果是所有图像URI都从更改http://graph.facebook.com/<fb user id>/picture为http://graph.facebook.com/<fb user id>/picture?type=large
| 归档时间: |
|
| 查看次数: |
5633 次 |
| 最近记录: |