2014-12-16 1 views
0

Например у меня есть следующие в 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)) 

Проблема с файлом по-прежнему стоит.

+0

Если вы удалите 'FormParser' из классов парсера, что-нибудь изменится? –

+0

Нет, это не проблема. Я уже нашел ответ, добавлю его чуть позже. – wswld

ответ

0

Ну, хороший 'deb debug помог найти проблему с этим кодом. Вот окончательный вариант:

data = json.loads(request.DATA.get('data', None)) 
data = data.get('data', None) 
data['logo']=request.FILES.get('file', None) 
serializer = ClientSerializer(data=data) 
    if serializer.is_valid(): 
    serializer.save() 
    return Response(utils.OK, status=status.HTTP_201_CREATED) 

Это все еще немного неуклюжий, но фактически рабочий кусок кода.