没有运算符匹配给定的名称和参数类型。 -Django F()表达式

时间:2019-06-11 15:40:16

标签: python django postgresql expression

我正在尝试使用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.

来自追溯的箭头指向+

如何解决?

请帮助。

1 个答案:

答案 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'))
)