鉴于我有詹姆斯和尤金的作者。使用内置的__inQuerySet 将过滤匹配 James 或 Eugene 的 m2m 字段。但是,如果我只想要那些匹配项,该怎么办。
示例设置:鉴于
authors = Author.objects.filter(interests__in=['python','ruby'])
# [<Author: James>, <Author: Eugene>]
Run Code Online (Sandbox Code Playgroud)
这是我为正常情况所做的查询。它将返回包含 James 或 Eugene 或两者的所有书籍:
books = Book.objects.filter(authors__in=authors)
# [<Book: Book by James, Jack>, <Book: Book by Eugene>]
Run Code Online (Sandbox Code Playgroud)
但目前如果我想找到一本由 James 和 Eugene 写的书,我将不得不循环。
books = Book.objects
for author in authors:
books = books.filter(authors=author)
# books [<Book: Book by James, Eugene>]
Run Code Online (Sandbox Code Playgroud)
是否有一种优雅的方法可以直接对匹配两个给定值的 m2m 字段进行过滤。也许像
books = Book.objects.filter(authors__match=authors)
Run Code Online (Sandbox Code Playgroud)
您可以使用 Q 对象:
AND = lambda q, value: q & Q(authors_in=value)
Books.objects.filter(reduce(AND, authors, Q()))
Run Code Online (Sandbox Code Playgroud)
如果您有作者列表而不仅仅是他们的 id,您还可以将 book_set 与在一起:
books = reduce(lambda q,a: q & a.book_set.all(), authors, Book.objects.none())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
780 次 |
| 最近记录: |