Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.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_Django Queryset - Fatal编程技术网

Python Django如何逐个查询对象

Python Django如何逐个查询对象,python,django,django-queryset,Python,Django,Django Queryset,我必须从模型中查询一个对象,这个对象称为“练习”,有许多字段(标题、正文、答案等)。我需要一个接一个地获取“练习对象”及其所有字段,对其进行渲染,并作为结果返回练习的pdf 问题是,如果我这样做: exercises = ExerciseModel.objects.all() 我都明白了。如果我这样做: some_exercises = ExerciseModel.objects.filter(something=something) 根据过滤器,我会得到“其中一些”。如果我这样做了: e

我必须从模型中查询一个对象,这个对象称为“练习”,有许多字段(标题、正文、答案等)。我需要一个接一个地获取“练习对象”及其所有字段,对其进行渲染,并作为结果返回练习的pdf

问题是,如果我这样做:

exercises = ExerciseModel.objects.all()
我都明白了。如果我这样做:

some_exercises = ExerciseModel.objects.filter(something=something)
根据过滤器,我会得到“其中一些”。如果我这样做了:

 exercise = ExerciseModel.objects.get()
我明白了

错误get()返回了多个练习


我怎样才能一个接一个地得到它们?我必须能够将它们用作另一个函数的输入。

如果只需要在一个练习中执行任务,请使用
get()
。在这种情况下,您需要一个条件来确保
get()
将返回1并且只返回1个结果

例如:

ex = ExerciseModel.objects.get(pk=123)
从:

返回与给定查找参数匹配的对象,该参数应采用字段查找中描述的格式

get()如果找到多个对象,则引发
multipleobjectsreern
MultipleObjectsReturned
异常是模型类的一个属性

get()如果未找到给定参数的对象,则引发
DoesNotExis
t异常。此异常是模型类的一个属性

当您有一个带有过滤器的查询集,确保基础SQL请求只返回1行时,您可以在查询集上调用
get()
,而不带参数。这会将行作为模型实例返回,而不是作为包含1个元素的列表返回

原始答复:

filter()
all()
方法都返回一个实例。您可以对它进行迭代,为请求返回的每个“练习”执行任务

for exercise in ExerciseModel.objects.filter(something=something):
    # ... do what you need on your exercise
从:

QuerySet是可编辑的,当您第一次迭代它时,它会执行它的数据库查询。例如,这将打印数据库中所有条目的标题


您需要的是
.iterator()
,它将查询集转换为迭代器:

exercises = ExerciseModel.objects.all().iterator()
然后在for循环中对其进行迭代:

for exercise in exercises:
    ...
当您有大量项目时,这将提高性能。然而,它也有一些负面影响,正如报告中所述

希望有帮助

.get()
必须返回单个对象,而不是QuerySet实例。如果要获得单个练习,则必须向
.get
实例传递一个参数。例如,按名称检索对象需要以下代码:

for i in range(Exercise.objects.all().count()):
    exercise = Exercise.objects.get(pk=i)
    ... operate on object ...
exercise=ExerciseModel.objects.get(name=“an\u exercise”)

如果希望遍历所有对象而不实际检索包含这些对象的查询集,可以使用以下代码:

for i in range(Exercise.objects.all().count()):
    exercise = Exercise.objects.get(pk=i)
    ... operate on object ...

为什么你不能迭代“全部”或“部分”?因为有30000个练习,我不能每次返回30000个pdf,我必须得到一个任意的练习,并且只对它进行操作,以获得一个实例,你需要实际通过一些标准,例如主键,到
get()
。首先感谢你的帮助,我曾经尝试过这种方法,但效果不好,因为我有一个30k+练习的“池”,我必须得到一个任意的练习,而不是一个接一个地得到所有的练习,我的不好,也许问题不是很清楚不是专家,但应该是:
用于ExerciseModel.objects.iterator(chunk\u size=100)中的练习:…
它将在所有对象上创建一个迭代器,但同时只有100个对象在内存中。。。