#python #django
#python #django
Вопрос:
Итак, у меня есть вложенный сериализатор, и я пытаюсь загрузить изображение, изображение там, но когда я пытаюсь настроить его на использование в сериализаторе, я получаю сообщение об ошибке. Мой код:
models.py
class Pet(models.Model):
pet_id = models.UUIDField('pet uid',default=uuid.uuid4,null=False,primary_key=True,blank=False,editable=False, unique=True)
name = models.CharField('Pet name', max_length=255, null=False, blank=False)
class Attachment(models.Model):
attachment_id = models.UUIDField('attachment uid',default=uuid.uuid4,null=False,primary_key=True,blank=False,editable=False, unique=True)
pet_id = models.ForeignKey(Pet, on_delete=models.CASCADE)
name = models.FileField(upload_to='photos/', null=False, blank=False)
upload_at = models.DateTimeField('Time it was uploaded', max_length=50, null=False, blank=False )
serializers.py
class AttachmentSerializer(serializers.ModelSerializer):
class Meta:
model = Attachment
fields = ('name','upload_at')
class PetSerializer(serializers.ModelSerializer):
attachments = AttachmentSerializer(many=True)
class Meta:
model = Pet
fields = ('pet_id','name', 'attachments')
def create(self, validated_data):
attachments = validated_data.pop('attachments')
pet = Pet.objects.create(**validated_data)
for att in attachments:
Attachment.objects.create(pet_id=pet, **att)
return pet
views.py
parser_classes = (MultiPartParser, FormParser)
def create_pet(self, request):
img = BytesIO(request.FILES.get('file_1').read())
img.seek(0)
data = Image.open(img)
new_data = request.data.copy()
new_data['attachments'] = [{'name':data, 'upload_at':datetime.now()}]
serializer = self.get_serializer(data=new_data)
if not serializer.is_valid():
return Response({'error':serializer.errors},status=status.HTTP_400_BAD_REQUEST)
serializer.save()
return Response({'data':serializer.validated_data}, status=status.HTTP_201_CREATED)
но я получаю UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
Отслеживание стека:
Traceback (most recent call last):
File "/srv/http/petProject/env/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/srv/http/petProject/env/lib/python3.8/site-packages/django/core/handlers/base.py", line 202, in _get_response
response = response.render()
File "/srv/http/petProject/env/lib/python3.8/site-packages/django/template/response.py", line 105, in render
self.content = self.rendered_content
File "/srv/http/petProject/env/lib/python3.8/site-packages/rest_framework/response.py", line 70, in rendered_content
ret = renderer.render(self.data, accepted_media_type, context)
File "/srv/http/petProject/env/lib/python3.8/site-packages/rest_framework/renderers.py", line 100, in render
ret = json.dumps(
File "/srv/http/petProject/env/lib/python3.8/site-packages/rest_framework/utils/json.py", line 25, in dumps
return json.dumps(*args, **kwargs)
File "/usr/lib/python3.8/json/__init__.py", line 234, in dumps
return cls(
File "/usr/lib/python3.8/json/encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python3.8/json/encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "/srv/http/petProject/env/lib/python3.8/site-packages/rest_framework/utils/encoders.py", line 50, in default
return obj.decode()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
Есть мысли по этому поводу? Заранее спасибо.
Комментарии:
1. Можете ли вы опубликовать всю трассировку стека? Какая строка вызывает ошибку?
2. @ C.Nivs вопрос обновлен, сэр.
Ответ №1:
Проблема была create_pet
в этой строке:
return Response({'data':serializer.validated_data}, status=status.HTTP_201_CREATED)
Я возвращал само изображение, поэтому, чтобы не получить ошибку, я просто заменяю сами изображения на его имя attachments
перед возвратом. Нравится:
files = []
for dicts in serializer.validated_data['attachments']:
for d in dicts:
d['name'] = d['name'].name
files.append(d)
serializer.validated_data['attachments'] = files
Это решило проблему.