python - 使用 Django 的 Q 查询过滤多对多关系
问题描述
我有一个模型
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 查询搜索说,“只向我显示该书的任何作者在其姓氏的任何部分都有查询字符串的书”?
解决方案
您可以通过两个连续的下划线 ( ) 来“查看”关系__
。因此,您可以在这里过滤last_name
作者包含特定子字符串的书籍:
Book.objects.filter(
authors__last_name__icontains=query
)
如果您因此查找Book
标题包含给定 的 s query
,或者其中last_name
一位作者的 包含query
,那么您可以使用以下内容进行过滤:
Book.objects.filter(
Q(title__icontains=query) |
Q(authors__last_name__icontains=query)
)
推荐阅读
- ffmpeg - 如何在 FFMPEG 中无损旋转 Sony A7Rii 的视频以避免编解码器错误?
- ruby-on-rails - 在 pagy gem in rails 中,您如何在不需要时隐藏分页?
- swift - 用于键盘输入AccessoryView 的简单 UIToolar 的布局约束错误
- swiftui - 有什么方法可以在 Struct 和 Class 之间共享全局变量?@Environment 不起作用
- typescript - react-spring - 如何最好地解决打字稿类型检查问题
- firebase - 尝试按照 Firebase for Flutter 教程构建失败(Android Studio)
- haskell - 用于二叉树集的 foldr
- julia - 禁止有关与现有标识符冲突的警告
- bash - 如何通过引用 powerline 包路径在 bash 上启动 powerline(在全局 pyenv 中)?
- html - Bootstrap4 汉堡菜单和链接项对齐