2014-06-06 34 views
5

Ho un serializzatore che segue un modello simile a:Django Riposo quadro: nidificato Serializzatori con FileField/ImageField

class Ticket: 
    customer = Customer() 
    ... 
class Customer: 
    signature = FileField() 
    name = CharField() 

E vorrei usare serializzatori di DRF Per pubblicare una nuova 'Ticket', così io mando dati multipart/form con il file di firma E i dati necessari di 'application/json'.

La richiesta risultante, dopo aver raccolto il file e dati, si presenta così:

>>> request.FILES 
<MultiValueDict: {u'customer.signature': [<InMemoryUploadedFile: signature.jpg (image/jpeg)>]}> 
>>> data 
{u'customer': {u'name': u'Test'}, ... } 
>>> serializer = TicketSerializer(data=data, files=request.FILES) 
>>> serializer.is_valid() 
False 
>>> serializer.errors 
{'customer': [{'signature': [u'This field is required.']}]} 

Come si usa il DRF Serializzatori/campi da riempire ImageFields/FileFields all'interno dello strato di 'clienti'?

+0

Ho lo stesso problema, anche se la mia 'FileField' è un campo personalizzato fa riferimento a campo di un modello di correlato – Neil

risposta

3

dal momento che sembra che non sono l'unico che ha questo problema, questa era la soluzione mi è venuta:

La risposta più straight-forward è quello di prendere il caricato ImageField/FileField e applicarle in la posizione appropriata con la parte "dati" nidificata del serializzatore. Nel mio caso, questo sarebbe all'interno del dettato 'cliente'.

Una volta che i file sono stati applicati correttamente ai dati, è possibile rilasciare la variabile 'files =', poiché tutti i file sono ora inclusi nei dati.

Un esempio di lavoro in codice sarebbe simile a questa:

>>> request.FILES 
<MultiValueDict: {u'customer.signature': [<InMemoryUploadedFile: signature.jpg (image/jpeg)>]}> 
>>> data 
{u'customer': {u'name': u'Test'}, ... } 
if 'customer.signature' in request.FILES: 
    data['customer']['signature_file'] = request.FILES['customer.signature'] 
>>> serializer = TicketSerializer(data=data) 
>>> serializer.is_valid() 
True 
Problemi correlati