Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.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查询集_Python_Django - Fatal编程技术网

Python 如何从值列表创建Django查询集

Python 如何从值列表创建Django查询集,python,django,Python,Django,我收到了一份这样的清单 a = [1, 2, 3, 4] 该列表与我们称之为Books的django模型中存储的id相匹配 我正在尝试返回一组id在列表中的图书。我正在考虑使用Q对象,并通过这样做来获取它们 Books.objects.filter(Q(id=1)| Q(id=2)| Q(id=3)| Q(id=4)) 现在我将使用如下索引: Books.objects.filter(Q(id=a[0])| Q(id=a[1])| Q(id=a[2])| Q(id=a[3]) 但是,这些列表的

我收到了一份这样的清单

a = [1, 2, 3, 4]
该列表与我们称之为Books的django模型中存储的id相匹配

我正在尝试返回一组id在列表中的图书。我正在考虑使用Q对象,并通过这样做来获取它们

Books.objects.filter(Q(id=1)| Q(id=2)| Q(id=3)| Q(id=4))

现在我将使用如下索引:

Books.objects.filter(Q(id=a[0])| Q(id=a[1])| Q(id=a[2])| Q(id=a[3])

但是,这些列表的长度将在30左右变化,硬编码索引将不起作用,而硬编码查询将无法满足列表长度的变化

可以走这条路吗?如果是这样的话,我如何才能完成归还id与列表匹配的书籍

您应该在此处使用:

Books.objects.filter(pk\uu in=a)
正如文件所说:

在给定的可数中;通常是
列表
元组
,或
查询集
。这不是一个常见的用例,但是字符串(可编辑)是可以接受的


对于简单的情况,请在查找中按照

但是,与
|
连接的Q对象不是神奇的语法,因此应该可以使用循环来构建它们的链,如

qlst = []
for x in some_iterable
    qel = Q( something based on x)
    qlst.append(qel)
if len(qlst) == 0:
    # oops -- must handle somehow, or code below will crash
filter = qlst[0]
for qel in qlst[1:]:
    filter = filter | qel

queryset = Books.objects.filter( filter)

警告:我从来没有真正需要尝试过这一点。

如果可以,我如何用字符串列表而不是整数来完成这一点?@Mfreeman:同样的方法,就是
a=['foo','bar']
,例如
Books.objects.filter(title\u in=a)
。你确定吗?在文档中,它显示
Entry.objects.filter(id\u in=[1,3,4])Entry.objects.filter(headline\u in='abc')
作为这些sql命令的等价物
SELECT。。。其中,id在(1,3,4)中;选择。。。其中标题在('a','b','c')
@Mfreeman:我很确定,您确定列表包含完全相同的字符串(没有前导/尾随空格等)?您是否将其作为字符串列表而不是单个字符串传递。@MFreeman:您可以使用
print(Books.objects.filter(…).query)
检查它生成的查询。但我真的很惊讶。
qlst = []
for x in some_iterable
    qel = Q( something based on x)
    qlst.append(qel)
if len(qlst) == 0:
    # oops -- must handle somehow, or code below will crash
filter = qlst[0]
for qel in qlst[1:]:
    filter = filter | qel

queryset = Books.objects.filter( filter)