2017-02-24 15 views
0

DRFには、「すべての人」を更新するようにシステムに指示する機能があります。そのリストを維持してください(私はこの例をダムにします、私はユースケースを一般化しようとしています)。どのユーザーが今日サインインしているかを調べるためにクエリを実行し、それらのユーザーをループして賞品を与えるための新しい活動を作成したいと考えています。Django RESTフレームワークのserializer.save()へのループ処理

書き込み時にループの最後の値を格納しているように見えます。

  time_threshold = datetime.now() - timedelta(hours=12) 
      signed_in_list = Activity.objects.filter(created__gte=time_threshold, activity="signed in") 
      for activity in signed_in_list: 
       serializer.save(user=activity.user_id, activity="gets free prize") 
      headers = self.get_success_headers(serializer.data) 
      return Response(serializer.data, status=status.HTTP_201_CREATED, 
        headers=headers) 

"signed_in_list"から返された各ユーザーIDに新しいアクティビティが書き込まれるようにしています。

私は新しいアクティビティエントリがループの各user_idに書き込まれると予想していましたが、ループ内の最後のuser_idを実行しています。これは、私がserializer.saveが動作していると思うのですが、ループのたびにそれ自身を上書きします(DBへの書き込みを実行するのと比べて)。

答えて

0

実際にユーザーではない場合は、「for user in」と「user.id」を参照してください。参照しているオブジェクトはアクティビティです。

理想的には、シリアライザを見たいと思いますが、querysetコマンドと同じ引数を渡した場合、シリアライザのモデルはアクティビティと仮定しますか?

この場合、クエリーセットで返された以前の既存のアクティビティと同じ主キーIDを持つ新しいアクティビティを保存しようとしています。これは更新ですが、シリアライザで更新を実行するには、Activityインスタンスを初期化したときにシリアライザに渡す必要があります。一般的に、DjangoモデルやDRFシリアライザのいずれであっても、保存するIDを渡す必要はありません。特に既存のIDは保存しないでください。

あなたが行うことができますが、Userモデルを参照し、「ユーザー」と呼ばれる活動モデルの外部キーを持っていると仮定すると:

time_threshold = datetime.now() - timedelta(hours=12) signed_in_list = Activity.objects.filter(created__gte=time_threshold, activity="signed in") for activity in signed_in_list: serializer.save(user=activity.user, activity="gets free prize") headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

「ユーザー= activity.user」に関しては、キーワード引数として渡されましたserializer.save()に、これはモデルを保存するときに行う方法です。私はそれがDRFシリアライザと同じだと思うが、私は100%確信していないが、うまくいかない場合は、user = activity.user.idを試すことができる。

+0

感謝と呼ばれる、私は質問のためのそれをより汎用的にするためにしようとしたとき、それがごちゃ混ぜになったと思います。私はあなたが指摘したコードのロジックと一致するように修正しました。これは、serializer.saveのように見えますが、このループ内で毎回実行するかわりに、create関数の終了として実行されます。 – probbins222

+0

上記の例では、リスト内の最後の項目に対してのみDB書き込みを実行します。 – probbins222

0

これを解決できた。むしろserializer.saveよりも、私がリクエストを更新し、再帰的に私の作成機能のコメントのための

def create(self, request, *args, **kwargs): 
     time_threshold = datetime.now() - timedelta(hours=12) 
     signed_in_list = Activity.objects.filter(created__gte=time_threshold, activity="signed in") 
     for activity in signed_in_list: 
      request.data["user"] = activity.user 
      self.create(request, *args, **kwargs) 
     return Response(status=status.HTTP_201_CREATED) 
関連する問題