Django REST Framework 関連性のないモデルを同時に登録したい


例: 本モデルと国モデルを同時に登録したい

models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)

class Country(models.Model):
    name = models.CharField(max_length=100)

serializers.Serializerを使う

単一モデルを登録する時にはserializers.ModelSerializerを使うが、関連性のないモデルを同時に登録する際は自分で設定を自由にできるserializers.Serializerを使う

serializers.py
from rest_framework import serializers

class UnrelatedModelsSerializer(serializers.Seralizer):
    title = serializers.CharField(max_length=100)
    name = serializers.CharField(max_length=100)
views.py
from rest_framework import generics, status
from .serializers import UnrelatedModelsSerializer

class CreateUnrelatedModelsView(generics.CreateAPIView):
    serializer_class = UnrelatedModelsSerializer

    # postメソッドをオーバーライドし、その中で関連性のないモデルのレコードを同時に作成する
    def post(self, request):
        serializer = self.get_serializer(data=request.data)

        # serializers.Serializerを使用している場合は自動的にバリデーションを行わないので、
        # 明示的にis_validメソッドを実行する
        if serializer.is_valid():
            # ポイント
            book = Book.objects.create(
                title = serializer.validated_data["title"]
            )
            country = Country.objects.create(
                name = serializer.validated_data["name"]

            return Response(status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

注意

バリデーションを通ったデータを上記viewではserializer.validated_dataから取り出していますが、入力がblank, またはnullを許容している場合、それらの値はserializerでチェックされないのでis_validを実行後serializer.validated_dataから取り出せません。そのような場合はrequest.dataから取り出します。