Например у меня есть следующие в models.py
:Django REST сериализатору не работает с файлами
def upload_attachments(filename):
return '/logos/%Y/%m_%d/{}'.format(filename) # well, not exactly, but close
class Client(models.Model):
name = models.CharField(unique=True, max_length=255)
logo = models.ImageField(upload_to=upload_attachments)
Serializer для этой модели будет выглядеть следующим образом:
class ClientSerializer(serializers.ModelSerializer):
class Meta:
model = Client
fields = (
'name',
'logo'
)
мнение, что работает с этим модель:
@renderer_classes((JSONRenderer,))
@parser_classes((FormParser, MultiPartParser))
class ClientView(APIView):
def post(self, request, domain=None):
data = request.DATA.get('data', None)
serializer = ClientSerializer(data=data, files=request.FILES.get('file', None))
if serializer.is_valid():
serializer.save()
return Response(utils.OK, status=status.HTTP_201_CREATED)
return Response({'error': serializer.errors}, status=status.HTTP_400_BAD_REQUEST)
я отправить форму POST с ключом file
, содержащей файл logo.png
и ключ data
, содержащий JSON. Я получаю либо не аргумент files
, хотя в сети есть много примеров работы, и если я оставлю этот файл (хотя я должен его получить), я получаю ошибку с data
, являющейся unicode, а не dict, и если я завершу data
в json.loads()
- есть «слишком много значений для распаковки».
Обновление: Я нашел, что было проблемой с данными. Это было просто:
data = request.DATA.get('data', None)
data = data.get('data', None) # roughly, sure it could be prettyfied
serializer = ClientSerializer(data=data, files=request.FILES.get('file', None))
Проблема с файлом по-прежнему стоит.
Если вы удалите 'FormParser' из классов парсера, что-нибудь изменится? –
Нет, это не проблема. Я уже нашел ответ, добавлю его чуть позже. – wswld