0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

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から取り出します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?