Django如何逐个查询对象

时间:2017-10-10 14:56:02

标签: python django django-queryset

我必须从模型中查询一个对象,这个对象叫做“exercise”,并且有很多字段(标题,正文,答案等)我需要逐个获取所有字段的“运动对象”,对它们进行一些渲染并返回结果的pdf。

问题是,如果我这样做:

exercises = ExerciseModel.objects.all()

我得到了所有这些。如果我这样做:

some_exercises = ExerciseModel.objects.filter(something=something)

我根据过滤器得到“其中一些”。如果我这样做:

 exercise = ExerciseModel.objects.get()

我得到了

  

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

我如何逐一获取它们?我必须能够将它们用作另一个功能的输入。

3 个答案:

答案 0 :(得分:1)

如果您只需要执行1次练习,请改用get()。在这种情况下,您需要一个标准来确保get()将返回1并且只返回1个结果。

示例:

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

来自doc

  

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

     如果找到多个对象,

get()会引发MultipleObjectsReturnedMultipleObjectsReturned异常是模型类的属性。

     如果找不到给定参数的对象,

get()会引发DoesNotExis t异常。此异常是模型类的属性。

如果您的QuerySet具有确保基础SQL请求只返回1行的过滤器,则可以在QuerySet上调用get()而不带参数。这将该行作为模型实例返回,而不是将其作为包含1个elemnt的列表返回。

原始答案:

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

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

来自documentation

  

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

答案 1 :(得分:0)

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

exercises = ExerciseModel.objects.all().iterator()

然后你在for循环中迭代它:

for exercise in exercises:
    ...

当您拥有大量商品时,这将提高效果。但是,它有一些缺点以及docs

中所述

希望它有所帮助!

答案 2 :(得分:-1)

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

exercise = ExerciseModel.objects.get(name="an_exercise")

如果要迭代遍历所有对象而不实际检索包含对象的QuerySet,可以使用以下代码:

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