【问题标题】:Filtering a many-to-many relationship with Django's Q query使用 Django 的 Q 查询过滤多对多关系
【发布时间】:2020-04-16 00:27:23
【问题描述】:

我有模特

class Book(models.Model):

    title = models.CharField(max_length=200)
    authors = models.ManyToManyField(Author)

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

我有一个看法

class SearchResultsListView(ListView):
    model = Book
    context_object_name = 'book_list'
    template_name = 'book/search_results.html'

    def get_queryset(self):
        query = self.request.GET.get('q')
        return Book.objects.filter(
            Q(title__icontains=query)
        )

我不知道如何访问外键。我如何进行 Q 查询,搜索“仅向我显示该书的任何作者在其姓氏的任何部分都有查询字符串的书”?

【问题讨论】:

    标签: python django django-views django-q


    【解决方案1】:

    您可以通过两个连续的下划线 (__) 来“查看”关系。因此,您可以在这里过滤作者的last_name 包含特定子字符串的书籍:

    Book.objects.filter(
        authors__last_name__icontains=query
    )

    如果您因此查找标题包含给定queryBooks,其中一位作者的last_name 包含query,那么您可以使用过滤:

    Book.objects.filter(
        Q(title__icontains=query) |
        Q(authors__last_name__icontains=query)
    )

    【讨论】:

      猜你喜欢
      • 2019-09-20
      • 1970-01-01
      • 2020-06-18
      • 2020-01-24
      • 2011-10-09
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      相关资源
      最近更新 更多