Django rest framework Django Rest框架:带有FileField/ImageField的嵌套序列化程序

Django rest framework Django Rest框架:带有FileField/ImageField的嵌套序列化程序,django-rest-framework,Django Rest Framework,我有一个序列化程序,其模型类似于: class Ticket: customer = Customer() ... class Customer: signature = FileField() name = CharField() 我想使用DRF的序列化程序发布一个新的“票证”,所以我发送多部分/表单数据以及签名文件和必要的“application/json”数据 收集文件和数据后,生成的请求如下所示: >>> request.FILES &

我有一个序列化程序,其模型类似于:

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.']}]}
>>> 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
>>请求文件
>>>资料
{u'customer':{u'name':u'Test'},…}
>>>序列化程序=票证序列化程序(数据=数据,文件=请求.files)
>>>序列化程序。_是否有效()
假的
>>>序列化程序错误
{'customer':[{'signature':[u'此字段是必需的。]}]}

如何使用DRF序列化器/字段来填充“客户”层中的ImageFields/FileFields?

由于我似乎不是唯一一个遇到此问题的人,因此我提出了以下解决方案:

最直接的答案是获取上传的ImageField/FileField,并将它们应用到序列化程序的嵌套“数据”部分的适当位置。在我的例子中,这将在“客户”目录中

一旦文件被正确地应用于数据,我们就可以删除'files='变量,因为所有文件现在都包含在数据中

代码中的工作示例如下所示:

>>> 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.']}]}
>>> 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
>>请求文件
>>>资料
{u'customer':{u'name':u'Test'},…}
如果request.file中有“customer.signature”:
数据['customer']['signature_file']=request.FILES['customer.signature']
>>>序列化程序=票证序列化程序(数据=数据)
>>>序列化程序。_是否有效()
真的

我也有同样的问题,尽管我的
文件字段是引用相关模型字段的自定义字段