Python for循环只在查询集上运行一次
问题描述:
我有一个queryset
,它返回三个对象,但是当我在queryset
上运行循环时,它只运行一次。Python for循环只在查询集上运行一次
这里是我的源代码:
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST or None, assigned=self.get_form_kwargs())
if form.is_valid():
inputs = request.POST.getlist('input_id[]')
pid = Model.objects.filter(id__in=inputs)
for obj_id in pid:
p = form.save(commit=False)
u = Staff.objects.get(id=self.request.user.id)
p.product = obj_id
p.assigned_by = u
p.save()
return JsonResponse({'status': 'ok', 'message': 'Object Created'})
有一个想法
答
终于解决了这一难题中的任何一个,问题是当我运行循环它创建了一个对象,一旦这意味着我错了我应该创建一个实例,每次循环运行时是我的代码:
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST or None, assigned=self.get_form_kwargs())
if form.is_valid():
for pid in request.POST.getlist('input_id[]'):
form.save(commit=False)
f = MyForm(request.POST, instance=MainModel(product=RelatedModel.objects.get(id=pid),
u_id=OtherModel.objects.get(id=self.request.user.id)),
assigned=self.get_form_kwargs())
f.save()
return JsonResponse({'status': 'ok', 'message': 'Handover Created'})
+1
这将在循环内运行查询集的get,这意味着如果没有缓存,它将转到数据库。现在Django很聪明,它会缓存数据库查询,但你不应该依赖它。正如已经提到的人,只需将其分配到一个列表中并多次使用即可。例如。 'my_objects = list(Model.objects.get())' – tayfun
+0
@tayfun我已经将它分配给列表,并且它工作正常,感谢这个想法 –
您使用的是什么ORM?我的猜测是,你正在使用的那个queryset对象是不可迭代的,并且首先需要被转换为一个列表。 –
我正在使用django,当我打印queryset的结果是',]>' –
我不知道我在哪里做错了,你可以想象它? @David Jenkins –