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