我正在尝试使用Django的link
向我的Postgresql
数据库中的每个F() expression
行中添加UTM参数,但是我一直遇到operator does not exist: character varying + unknown.
错误。
这是我要从views.py中应用的功能:
def utm_param(request):
if request.GET.get('mybtn'): # to improve, == 'something':
Product.objects.all().update(link=F('link') + '?utm_source=uvergo&utm_medium=ref')
return render(request, "form.html")
这是我得到的错误:
return self.cursor.execute(sql, params) psycopg2.errors.UndefinedFunction: operator does not exist: character varying + unknown LINE 1: ...link" = ("search_product"."link" + '?utm_so... ^ HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
来自追溯的箭头指向+
。
如何解决?
请帮助。
答案 0 :(得分:1)
您应在此处使用Concat
[django-doc]连接字符串:
from django.db.models import Value
from django.db.models.functions import Concat
Product.objects.update(
link=Concat(F('link'), Value('?utm_source=uvergo&utm_medium=ref'))
)
话虽如此,以上内容仍将'?utm_source=uvergo&utm_medium=ref'
附加到每个链接,即使这些链接已经包含'?utm_source=uvergo&utm_medium=ref'
。
您可以通过排除带有__endswith
lookup [Django-doc]的内容来阻止第二次添加:
from django.db.models import Value
from django.db.models.functions import Concat
Product.objects.exclude(
link__endswith='?utm_source=uvergo&utm_medium=ref'
).update(
link=Concat(F('link'), Value('?utm_source=uvergo&utm_medium=ref'))
)