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
あなたのThingモデルを投稿しますか? – e4c5