Локальная база данных работает, но на Heroku я получаю: operator does not exist: text % unknown
Я занимаюсь этим вопросом уже несколько дней.
У меня есть база данных Postgres (версия 13), установленная локально и на Heroku. Django и версия Python идентичны. Когда я делаю api вызов к моей локальной базе данных, все в порядке - но когда я делаю вызов к базе данных Heroku, я получаю ошибку ниже.
Вход поиска (например, 'party') - строка, модель "trademark_trademark" - тип
models.TextField(null=True)
Я понимаю, что ошибка говорит о том, что мне нужно убедиться, что вводимый запрос имеет правильный тип. Может ли строка не запрашивать TextField. Если да, то какого типа оно должно быть. Я дилетант и не могу разобраться в этом - есть идеи, в чем может быть проблема?
ProgrammingError at /trademarks/api/trademarks/
operator does not exist: text % unknown
LINE 1: ...rademark" WHERE "trademark_trademark"."trademark" % 'party' ...
^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
Request Method: GET
Request URL: https://CENSORED.herokuapp.com/trademarks/api/trademarks/?q=party&class_nos=0&no_related=true
Django Version: 4.0.5
Exception Type: ProgrammingError
Exception Value:
operator does not exist: text % unknown
LINE 1: ...rademark" WHERE "trademark_trademark"."trademark" % 'party' ...
^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
Exception Location: /app/.heroku/python/lib/python3.9/site-packages/django/db/backends/utils.py, line 89, in _execute
Python Executable: /app/.heroku/python/bin/python
Python Version: 3.9.15
Python Path:
['/app/.heroku/python/bin',
'/app',
'/app/.heroku/python/lib/python39.zip',
'/app/.heroku/python/lib/python3.9',
'/app/.heroku/python/lib/python3.9/lib-dynload',
'/app/.heroku/python/lib/python3.9/site-packages']
Server time: Wed, 02 Nov 2022 23:00:27 +0000
Я пробовал разные версии postgresql, django и python.
Соответствующий код выглядит следующим образом (ошибка, похоже, связана с queryset = self.filter_queryset(self.get_queryset()) )
class TrademarkList(generics.ListAPIView):
serializer_class = TrademarkSerializer
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
serializer = self.get_serializer(queryset, many=True)
response_list = serializer.data
newdict = {'count': self.total_no}
response_list = {'results': response_list, 'extra': newdict}
return Response(response_list)
def get_queryset(self):
start = time.time()
print('MEEP')
try:
q = self.request.query_params.get('q')
except:
q = None
...
...
class_nos = self.request.query_params.get('class_nos')
no_related = self.request.query_params.get('no_related')
api_class_list = class_nos.split(",")
conflicting = not self.request.query_params.get('no_related')
# print(conflicting)
if q is not None:
# return search(q)
search_classes = []
if class_nos!='0' and class_nos!=None:
for k in api_class_list:
# print k
search_classes.append(k)
if conflicting!='false':
search_classes.extend(get_conflicting_classes(k))
else:
break
q_set = q.split(' ')
q_set_tri = []
for i in q_set:
n=0
for j in range(0, len(i)):
try:
triad = i[n:n+2]
print(triad)
if len(triad)==2:
q_set_tri.append(triad)
n+=1
except:
break
q_replaced = q.replace('-','').replace('.','').replace("'",'').replace("'",'')
queryset_tri = Trademark.objects.filter(trademark__trigram_similar = q_replaced)
queryset = queryset_tri.filter(status__in = ('Registered','Pending','Accepted','Advertised','Accepted with conditions','Provisionally refused'))
results = queryset
sorted_results = tmsearch.custom_input_sort_2022(results,q_replaced)
self.total_no = len(sorted_results)
return sorted_results
....