gpt4 book ai didi

python - 匹配所有给定值的 m2m 字段上的 Django 过滤器

转载 作者:行者123 更新时间:2023-11-28 16:47:17 24 4
gpt4 key购买 nike

鉴于我是 James 和 Eugene 的作者。使用内置的 __in QuerySet 将过滤匹配 James 或 Eugene 的 m2m 字段。但是,如果我只想要那些匹配两者的方法。

示例设置:鉴于此

authors = Author.objects.filter(interests__in=['python','ruby'])
# [<Author: James>, <Author: Eugene>]

这是我针对正常情况所做的查询。它将返回任何包含 James 或 Eugene 或两者的书籍:

books = Book.objects.filter(authors__in=authors)
# [<Book: Book by James, Jack>, <Book: Book by Eugene>]

但目前如果我想找到一本 James 和 Eugene 合着的书,我将不得不循环。

books = Book.objects
for author in authors:
books = books.filter(authors=author)
# books [<Book: Book by James, Eugene>]

是否有一种优雅的方法可以直接对匹配两个给定值的 m2m 字段进行过滤。也许像

books = Book.objects.filter(authors__match=authors)

最佳答案

您可以使用 Q 对象:

AND = lambda q, value: q & Q(authors_in=value)
Books.objects.filter(reduce(AND, authors, Q()))

如果您有作者列表而不仅仅是他们的 ID,您也可以将 book_set 与在一起:

books = reduce(lambda q,a: q & a.book_set.all(), authors, Book.objects.none())

关于python - 匹配所有给定值的 m2m 字段上的 Django 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12429869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com