REST Django - Как изменить сериализованный файл до того, как он будет помещен в модель
Я надеюсь, что смогу найти способ изменить размер загруженного файла изображения до того, как он будет помещен в базу данных. Я новичок в Django с REST, поэтому я не уверен, как это можно сделать. Кажется, что все, что сериализуется, просто автоматически попадает прямо в модель. В этом, я полагаю, и есть смысл (это, конечно, легко настроить).
Чтобы прояснить, у меня уже есть протестированная и работающая функция, которая изменяет размер изображения для меня. Она может быть изменена по мере необходимости, и это не проблема для меня. Вопрос действительно в том, чтобы как бы "перехватить" изображение, внести свои изменения, а затем поместить его в модель. Не мог бы кто-нибудь помочь мне с идеями тактики, как это сделать? Спасибо.
Модель:
class Media(models.Model):
objects = None
username = models.ForeignKey(User, to_field='username',
related_name="Upload_username",
on_delete=models.DO_NOTHING)
date = models.DateTimeField(auto_now_add=True)
media = models.FileField(upload_to='albumMedia', null=True)
file_type = models.CharField(max_length=12)
MEDIA_TYPES = (
('I', "Image"),
('V', "Video")
)
media_type = models.CharField(max_length=1, choices=MEDIA_TYPES, default='I')
user_access = models.CharField(max_length=1, choices=ACCESSIBILITY, default='P')
class Meta:
verbose_name = "MediaManager"
Представление с методом post:
class MediaView(APIView):
queryset = Media.objects.all()
parser_classes = (MultiPartParser, FormParser)
permission_classes = [permissions.IsAuthenticated, ]
serializer_class = MediaSerializer
def post(self, request, *args, **kwargs):
user = self.request.user
print(user.username)
request.data.update({"username": user.username})
media_serializer = MediaSerializer(data=request.data)
# media_serializer.update('username', user.username)
if media_serializer .is_valid():
media_serializer.save()
return Response(media_serializer.data, status=status.HTTP_201_CREATED)
else:
print('error', media_serializer.errors)
return Response(media_serializer.errors,status=status.HTTP_400_BAD_REQUEST)
Сериализатор:
class MediaSerializer(serializers.ModelSerializer):
class Meta:
model = Media
fields = '__all__'
def to_representation(self, instance):
data = super(MediaSerializer, self).to_representation(instance)
return data
Вы можете использовать метод validate для проверки и/или изменения значений из словаря data.
class MediaSerializer(serializers.ModelSerializer):
...
def validate(self, data):
value_from_form = data['value_from_form']
value_from_form = 'Something else'
data['value_from_form'] = value_from_form
return data