我有一个序列化程序,它遵循类似于:
的模型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?
答案 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