Ни один оператор не соответствует данному имени и типу аргумента. - выражение Django F () - PullRequest
1 голос
/ 11 июня 2019

Я пытаюсь добавить параметры UTM в каждую link строку в моей Postgresql базе данных, используя F() expression Джанго, но продолжаю получать ошибку operator does not exist: character varying + unknown..

Вот функция I 'я пытаюсь применить из моих 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 Ответ

1 голос
/ 11 июня 2019

Вы должны использовать Concat [django-doc] здесь, чтобы объединить строки:

from django.db.models import Value
from django.db.models.functions import <b>Concat</b>

Product.objects.update(
    link=<b>Concat(</b>F('link')<b>, Value(</b>'?utm_source=uvergo&utm_medium=ref'<b>))</b>
)

При этом вышеизложенное добавит сюда'?utm_source=uvergo&amp;utm_medium=ref' до каждая ссылка, даже если они уже содержат '?utm_source=uvergo&amp;utm_medium=ref'.

Вы можете предотвратить добавление этой ссылки во второй раз, исключив ссылки с __endswith lookup [Django-doc] :

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

Product.objects.exclude(
    <b>link__endswith='?utm_source=uvergo&utm_medium=ref'</b>
).update(
    link=Concat(F('link'), Value('?utm_source=uvergo&utm_medium=ref'))
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...