我必须从模型中查询一个对象,这个对象叫做“exercise”,并且有很多字段(标题,正文,答案等)我需要逐个获取所有字段的“运动对象”,对它们进行一些渲染并返回结果的pdf。
问题是,如果我这样做:
exercises = ExerciseModel.objects.all()
我得到了所有这些。如果我这样做:
some_exercises = ExerciseModel.objects.filter(something=something)
我根据过滤器得到“其中一些”。如果我这样做:
exercise = ExerciseModel.objects.get()
我得到了
错误get()返回了多个练习
我如何逐一获取它们?我必须能够将它们用作另一个功能的输入。
答案 0 :(得分:1)
如果您只需要执行1次练习,请改用get()
。在这种情况下,您需要一个标准来确保get()
将返回1并且只返回1个结果。
示例:
ex = ExerciseModel.objects.get(pk=123)
来自doc:
返回与给定查找参数匹配的对象,该参数应采用字段查找中描述的格式。
如果找到多个对象,get()会引发
如果找不到给定参数的对象,MultipleObjectsReturned
。MultipleObjectsReturned
异常是模型类的属性。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
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 ...