Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何查询django m2m以获得满足多个需求的单个实例?_Python_Django_Django Orm - Fatal编程技术网

Python 如何查询django m2m以获得满足多个需求的单个实例?

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

例如,我有以下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(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对象。哦,太棒了,我不知道
|=
是件事!