Причины, по которым сериализатор не проверяет данные DRF

Я отправляю данные через postman следующим образом

enter image description here

мой model.py выглядит следующим образом

def get_upload_path(instance, filename):
model = instance._meta
name = model.verbose_name_plural.replace(' ', '_')
return f'{name}/images/{filename}'

class ImageAlbum(models.Model):
def default(self):
    return self.images.filter(default=True).first()

def thumbnails(self):
    return self.images.filter(width__lt=100, length_lt=100)

class Photo(models.Model):
    name = models.CharField(max_length=255, null=True, blank=True)
    photo = models.ImageField(upload_to=get_upload_path, null=True, blank=True)
    default = models.BooleanField(default=False, null=True, blank=True)
    width = models.FloatField(default=100, null=True, blank=True)
    length = models.FloatField(default=100, null=True, blank=True)
    description = models.CharField(max_length=2000, null=True, blank=True)
    latitude = models.DecimalField(max_digits=11, decimal_places=2, null=True, blank=True)
    longitude = models.DecimalField(max_digits=11, decimal_places=2, null=True, blank=True)
    album = models.ForeignKey(ImageAlbum, related_name='album_data', on_delete=models.CASCADE, null=True, blank=True)

мой view.py выглядит следующим образом

class ImageAlbumListApiView(APIView):
    permission_classes = [IsAuthenticated]
    parser_classes = [MultiPartParser, FormParser, ]

    def get(self, request):
        image_album = ImageAlbum.objects.all()
        serializer = ImageAlbumSerializer(image_album, many=True)
        return Response(serializer.data)
    
    def post(self, request):
        serializer = ImageAlbumSerializer(data=request.data)
        print(request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response(serializer.data)
        else:
            return Response(serializer.errors)

Мой serializer.py выглядит следующим образом

class PhotoSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.Photo
        fields = '__all__'

class ImageAlbumSerializer(serializers.ModelSerializer):
    album_data = PhotoSerializer(many=True, read_only=True)
    file = serializers.ListField(
        child = serializers.ImageField(max_length = 1000000, allow_empty_file = False, use_url = False,
        write_only = True), write_only=True)
    
    class Meta:
        ###Test###
        model = models.ImageAlbum
        fields = ['id', 'album_data', 'file']
        read_only_fields = ['id']
    
    def create(self, validated_data):
        #album_data = validated_data.get('album_data')
        print(validated_data)
        uploaded_files = validated_data.get('file')
        #image_info = validated_data.pop('images')
        album = models.ImageAlbum.objects.create()
        for uploaded_item in uploaded_files:
            models.Photo.objects.get_or_create(album=album, photo=uploaded_item)
        return album

Теперь проблема заключается в следующем:

когда я отправляю данные через Postman, в представлении я получаю данные с обоими ключами, т.е. 'album_data', который содержит вложенные JSON данные и 'file', который содержит список загруженных файлов.

Но я не получаю ключ 'album_data' в validated_data функции create в сериализаторе.

Поскольку я новичок в DRF, я не могу определить, почему валидация данных в сериализаторе не работает?

Вот проблема, на ImageAlbumSerializer

    ...
    album_data = PhotoSerializer(many=True, read_only=True)
    ...

Данные передаются из request.data, но вы объявили их как поле read_only. Поэтому, как следует из названия, attr является read_only, поэтому он не будет проверен или даже передан методу validate. Просто удалите этот аргумент, и все будет работать

Вернуться на верх