Django Rest框架:使用FileField / ImageField的嵌套序列化程序

时间:2014-06-06 01:46:59

标签: django-rest-framework

我有一个序列化程序,它遵循类似于:

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

我想使用DRF的序列化程序来发布一个新的“Ticket”,所以我发送带有签名文件和必要的'application / json'数据的multipart / form数据。

收集FILES和DATA后,生成的请求如下所示:

>>> 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?

1 个答案:

答案 0 :(得分: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