2016-10-03 11 views
0

Django/Django Rest Framework 3を使用してバルク挿入を実行しようとすると、検証ステップでn * related_model_fieldsというクエリが発生し、多くの不要な遅延が発生します。Django REST Frameworkは、バッチ作成で複数の検証クエリを防止します

Thingには2つの関連フィールドがあり、1つはユーザー(ビューに追加)で、もう1つは外部キー関連フィールドの別のモデルのpkです。バッチ内の各アイテムは個別に検証され、検証にはUserモデルのルックアップとその他の関連モデルが含まれ、検証のためにバッチ内の項目ごとに2つのクエリが発生します。

この動作を無効にしてデータの「バッチ」検証を行う方法はありますか?あるいは、複数のデータベースのラウンドトリップを防ぐために、照会の動作をオーバーライドして、事前照会された値のセットに対して検証することはできますか?

class ThingView(APIView): 
    def post(self, request): 
     # Add user to each record 
     user_id = self.request.user.id 
     map(lambda rec: rec.update(user=user_id), request.data) 

     serializer = ThingSerializer(data=request.data, many=True) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

class ThingListSerializer(serializers.ListSerializer): 
    def create(self, validated_data): 
     things = [Thing(**item) for item in validated_data] 
     return Thing.objects.bulk_create(things) 

class ThingSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Thing 
     list_serializer_class = ThingListSerializer 
+0

あなたのThingモデルを投稿しますか? – e4c5

答えて

0

独自のバリデータをロールして、デフォルトのものを置き換えたいと思う可能性があります。たとえば、Userには、DBに既存のusernameを照会するUniqueValidatorがあります。それを削除して、自分で明示的にその制約を処理することができます。

関連する問題