1 to N 필드 한번에 저장하기

Posted on 2021-08-30 by GKSRUDTN99
Django Rest Framework DRF Serializer

Post 객체가 필드로 여러개의 ImageField를 가지고 있다고 가정한다.


model

# models.py

class Post(models.Model):
    title = models.CharField(max_length=200)

class PostImage(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    image = models.ImageField(upload_to="post/%Y/%m/%d")

serializers.py

  1. 우선, 이미지를 직렬화할 PostImageSerializer를 둔다.
  2. Post 하나를 작성할 때 여러개의 이미지를 받아 한번에 저장할 것이므로, PostImageSerializer를 images 변수를 두어 가져온다.
  3. PostImageSerializer의 create()함수를 override하여 구현한다.
class PostImageSerializer(serializer.ModelSerializer):
    class Meta:
        model = PostImage
        fields = ['image']

class PostSerializer(serializer.ModelSerializer):
    images = PostImageSerializer(many=True, read_only=True)

    class Meta:
        model = Post
        fields = ['id', 'title', 'images']

        def create(self, validated_data):
            images_data = self.context['request'].FILES
            post = Post.objects.create(**validated_data)
            for image_data in images_data.getlist('image'):
                PostImage.objects.create(post=post, image=image_data)
            return post