【问题标题】:Django - how to add another field to be search in my querysetDjango - 如何在我的查询集中添加另一个要搜索的字段
【发布时间】:2019-03-29 07:45:23
【问题描述】:

目前正在学习 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:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\exception.py" in inner 34. response = get_response(request)

File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py" in _get_response 126. response = self.process_exception_by_middleware(e, request)

File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py" in _get_response 124. response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\admin\thesis\blackink_website\catalog\views.py" in Search 73. Q(genre__icontains=query)

File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\query.py" in filter 844. return self._filter_or_exclude(False, *args, **kwargs)

File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\query.py" in _filter_or_exclude 862. clone.query.add_q(Q(*args, **kwargs))

File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\sql\query.py" in add_q 1263. clause, _ = self._add_q(q_object, self.used_aliases)

File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\sql\query.py" in _add_q 1281. current_negated, allow_joins, split_subq)

File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\sql\query.py" in _add_q 1287. split_subq=split_subq,

File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\sql\query.py" in build_filter 1225. condition = self.build_lookup(lookups, col, value)

File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\sql\query.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

【问题讨论】:

    标签: django django-views django-queryset


    【解决方案1】:

    因为genreManyToMany。如果使用icontain,则必须查找Genre 的一个字段。 比如id字段的例子:Q(genre__id__icontains=query)

    随着您的更新。我猜你想找到genre 的名字。您可以尝试像这样更新query

        queryset = queryset.filter(
            Q(title__icontains=query) |
            Q(genre__name __icontains=query) 
        ).distinct()
    

    【讨论】:

    • 我应该在 icontains 旁边使用什么?
    • query = request.GET.get('q') 中有哪些数据?您在genre 中寻找什么领域?你能用模型genre更新你的问题吗?
    • 谢谢。我将发布另一个关于搜索的主题。希望你能看到。
    猜你喜欢
    • 2018-05-25
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 2021-05-11
    • 2018-03-21
    相关资源
    最近更新 更多