2014-06-06 14 views
5

Ich habe einen Serializer, die ein Modell ähnlich wie folgt:Django Ruhe Framework: Nested Serializer mit Filefield/Imagefield

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

Und ich möchte verwenden DRF Serializer ein neues ‚Ticket‘ zu veröffentlichen, so sende ich multipart/form Daten mit der Signaturdatei UND den notwendigen 'application/json' Daten.

Die resultierende Anfrage, nachdem die Dateien und Daten zu sammeln, sieht wie folgt aus:

>>> 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.']}]} 

Wie verwende ich die DRF Serializer/Felder ImageFields/FileFields in der ‚Kunde‘ Schicht zu füllen?

+0

ich das gleiche Problem haben, wenn mein 'FileField' ist ein benutzerdefiniertes Feld ein verwandtes Modell Feld Referenzierung – Neil

Antwort

3

Da es scheint, ich bin nicht der einzige, der dieses Problem hat, ist dies die Lösung war ich kam mit:

Die Straight-Forward-Antwort ist die hochgeladen Imagefield/Filefield zu nehmen und wenden sie in die entsprechende Position mit dem verschachtelten Datenabschnitt des Serialisierers. In meinem Fall wäre das im "Kunden" -Diktat.

Sobald die Dateien ordnungsgemäß auf die Daten angewendet wurden, können wir die Variable 'files =' löschen, da alle Dateien jetzt in den Daten enthalten sind.

Ein Arbeitsbeispiel in Code würde wie folgt aussehen:

>>> 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 
Verwandte Themen