#django #django-views #django-queryset
#django #django-просмотры #django-набор запросов
Вопрос:
В настоящее время изучаю django. Я пытаюсь добавить значки жанра для моего существующего поиска, которые извлекают только название. но мне интересно, почему я получаю сообщение об ошибке из-за неправильного поиска в соответствующем поле: icontains
это мой код поиска в views.py
def Search(request):
queryset = Book.objects.all()
query = request.GET.get('q')
if query:
queryset = queryset.filter(
Q(title__icontains=query) |
Q(genre__icontains=query)
).distinct()
context = {
'queryset': queryset
}
return render(request, 'search_results.html', context)
вот моя модель книги.
class Book(models.Model):
title = models.CharField(max_length=200)
```some fields```
genre = models.ManyToManyField(Genre, help_text="Select a genre for this book")
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('book-detail', kwargs={'slug': self.slug})
вот мои жанровые модели
class Genre(models.Model):
name = models.CharField(
max_length=200,
help_text="Enter a book genre (e.g. Science Fiction, French Poetry etc.)"
)
featured = models.BooleanField(null=True, default=False)
def __str__(self):
return self.name
Обратная трассировка:
File "C:UsersadminAppDataLocalProgramsPythonPython37-32libsite-packagesdjangocorehandlersexception.py" in inner 34. response = get_response(request)
File "C:UsersadminAppDataLocalProgramsPythonPython37-32libsite-packagesdjangocorehandlersbase.py" in _get_response 126. response = self.process_exception_by_middleware(e, request)
File "C:UsersadminAppDataLocalProgramsPythonPython37-32libsite-packagesdjangocorehandlersbase.py" in _get_response 124. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:Usersadminthesisblackink_websitecatalogviews.py" in Search 73. Q(genre__icontains=query)
File "C:UsersadminAppDataLocalProgramsPythonPython37-32libsite-packagesdjangodbmodelsquery.py" in filter 844. return self._filter_or_exclude(False, *args, **kwargs)
File "C:UsersadminAppDataLocalProgramsPythonPython37-32libsite-packagesdjangodbmodelsquery.py" in _filter_or_exclude 862. clone.query.add_q(Q(*args, **kwargs))
File "C:UsersadminAppDataLocalProgramsPythonPython37-32libsite-packagesdjangodbmodelssqlquery.py" in add_q 1263. clause, _ = self._add_q(q_object, self.used_aliases)
File "C:UsersadminAppDataLocalProgramsPythonPython37-32libsite-packagesdjangodbmodelssqlquery.py" in _add_q 1281. current_negated, allow_joins, split_subq)
File "C:UsersadminAppDataLocalProgramsPythonPython37-32libsite-packagesdjangodbmodelssqlquery.py" in _add_q 1287. split_subq=split_subq,
File "C:UsersadminAppDataLocalProgramsPythonPython37-32libsite-packagesdjangodbmodelssqlquery.py" in build_filter 1225. condition = self.build_lookup(lookups, col, value)
File "C:UsersadminAppDataLocalProgramsPythonPython37-32libsite-packagesdjangodbmodelssqlquery.py" in build_lookup 1087. raise FieldError('Related Field got invalid lookup: {}'.format(lookup_name))
Exception Type: FieldError at /search/ Exception Value: Related Field got invalid lookup: icontains
Ответ №1:
Потому что genre
есть ManyToMany
. Если вы используете icontain
, вы должны выполнить поиск в одном поле Genre
. Как пример с полем id
: Q(genre__id__icontains=query)
С вашим обновленным. Я думаю, вы хотите найти имя genre
. Вы можете попробовать обновить query
следующим образом:
queryset = queryset.filter(
Q(title__icontains=query) |
Q(genre__name __icontains=query)
).distinct()
Комментарии:
1. что я должен использовать рядом с icontains?
2. Какие данные в
query = request.GET.get('q')
? В каком поле вы ищетеgenre
? Можете ли вы обновить свой вопрос с помощью modelgenre
?3. Спасибо. Я опубликую другую тему о поиске. Я надеюсь, вы это видите.