2017-09-24 25 views
0

私はquerysetを持っていますが、私はループを実行してquerysetを実行すると1回だけ実行されます。ここで 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'}) 

+0

どのORMを使用していますか?私の推測では、使用しているクエリーセットオブジェクトは反復可能ではなく、まずリストに変換する必要があります。 –

+0

私はdjangoを使用しています。クエリーセットを印刷すると、結果は ']>' –

+0

です。 @David Jenkins –

答えて

0

最後にパズルを解く考えを有するものであれ、問題は、それはそれは私が間違っていたことを意味したら、オブジェクトを作成したIループがここで実行されるたびにインスタンスを作成するはずでした。コード:

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はスマートで、DBクエリをキャッシュしますが、それに頼るべきではありません。既に言及した人のように、それをリストに割り当てて、それを複数回使用してください。例えば。 'my_objects = list(Model.objects.get())' – tayfun

+0

@tayfun私はそれをリストに割り当てました。それはうまく動作します。アイデアのおかげで –

関連する問題