Python 如何查询django m2m以获得满足多个需求的单个实例?
例如,我有以下Django模型:Python 如何查询django m2m以获得满足多个需求的单个实例?,python,django,django-orm,Python,Django,Django Orm,例如,我有以下Django模型: class Author(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) class Book(models.Model): name = models.CharField(max_length=30) authors = models.ManyToManyField(A
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
class Book(models.Model):
name = models.CharField(max_length=30)
authors = models.ManyToManyField(Author)
(因为书籍经常有多个作者,而作者经常写多本书)
现在假设我有一个元组形式的作者姓名列表:
author_list = [('clarke', 'arthur'), ('herbert', 'frank'), ('asimov', 'isaac')]
是否有一种方法可以查询其authors
m2m字段至少有一个Author
实例满足以下条件的所有书籍
author.last_name = pair[0]
author.first_name = pair[1]
对于作者列表中的某对?也就是说,让给定作者列表中的至少一位作者贡献所有书籍
我*想要*写的查询如下所示:
Book.objects.filter(
authors__first_name__in=[pair[1] for pair in author_list],
authors__last_name__in=[pair[0] for pair in author_list]
)
但这是行不通的,因为所有的排列(亚瑟·赫伯特、弗兰克·阿西莫夫、艾萨克·克拉克等等)都是允许的。但我不知道该怎么说,基本上:
“选择所有作者同时满足这两项要求的书籍。”
或者说真的:
'选择所有作者(姓、名)在该元组列表中的书籍。'
在django中有没有一种干净的搜索方法?我认为可以使用q对象构建查询
Q(姓氏=pair2[0],姓氏=pair2[1])Q(姓氏=pair2[0],姓氏=pair2[1])
上面的查询应该生成名为clark、名为arthur或名为herbert、名为frank的get图书
关于如何动态执行此操作,有很多答案:
您可能需要处理查询并检查django生成的查询,以验证它是否是您想要的
query = []
for last_name, first_name in author_list:
query.append(Q(authors__last_name=last_name, authors__first_name=first_name))
query = reduce(operator.or_, query)
Book.objects.filter(query)
但如果你看到更好的,请仍然回答 你可以
根据您的回答,但不使用reduce
和操作符
:
query = Q()
for last_name, first_name in author_list:
Q |= Q(authors__last_name=last_name, authors__first_name=first_name)
Book.objects.filter(query)
尝试使用
Q
对象。你可以用|
或&
连接两个Q对象。哦,太棒了,我不知道|=
是件事!