2014-06-06 142 views
5

我已經遵循類似的模型串行:Django的REST框架:嵌套的序列化與FileField或/ ImageField的

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

而且我想用DRF的串行要發佈一個新的「票」,所以我送與簽名文件和必要的'application/json'數據一起多部分/形成數據。

產生的請求,收集文件和數據後,看起來是這樣的:

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

如何使用DRF串行器/字段填寫「客戶」層內ImageFields/FileFields?

+0

我有同樣的問題,雖然我的'FileField'是一個自定義字段引用相關模型的場 – Neil

回答

3

因爲它似乎我不是誰都有這個問題只有一個,這就是我想出瞭解決方案:

最直接的答案就是要把上傳的ImageField/FileField字段,並將其應用到串行器的嵌套'數據'部分的適當位置。在我的情況下,這將在'客戶'字典內。

將文件正確應用於數據後,我們可以刪除'files ='變量,因爲所有文件現在都包含在數據中。

代碼

工作示例會是這個樣子:

>>> 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 
相關問題