Причины, по которым сериализатор не проверяет данные DRF
Я отправляю данные через postman следующим образом
мой 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
. Просто удалите этот аргумент, и все будет работать