2013-04-18 25 views
1

我试图通过的multipart/form-data的形式和Tastypie API来上传文件和正在运行了一些问题:Django的Tastypie反序列化的multipart/form-data的上传档案

我的模型:

class Client(models.Model): 
    account = models.ForeignKey(Account) 
    client_image = models.FileField(upload_to=client_image_path, default="/assets/img/default-user-image.png", blank=True, null=True) 
    client_image_thumb = models.FileField(upload_to=client_image_thumb_path, default="/assets/img/default-user-image.png", blank=True, null=True) 

我使用在Tastypie问题#42概述了自定义的反序列化方法:

class MultipartResource(object): 
    def deserialize(self, request, data, format=None): 
     if not format: 
      format = request.META.get('CONTENT_TYPE', 'application/json') 

     if format == 'application/x-www-form-urlencoded': 
      return request.POST 

     if format.startswith('multipart'): 
      data = request.POST.copy() 
      data.update(request.FILES) 
      return data 

     return super(MultipartResource, self).deserialize(request, data, format) 

    def put_detail(self, request, **kwargs): 
     if request.META.get('CONTENT_TYPE').startswith('multipart') and \ 
       not hasattr(request, '_body'): 
      request._body = '' 

     return super(MultipartResource, self).put_detail(request, **kwargs) 

,这里是我的相应ModelResource:

class ClientResource(MultipartResource, ModelResource): 
    account = fields.ForeignKey(AccountResource, 'account') 

    class Meta(): 
     queryset = Client.objects.all() 
     always_return_data = True 
     resource_name = 'account/clients/client-info' 
     authorization = AccountLevelAuthorization() 
     list_allowed_methods = ['get','post','put','delete','patch'] 
     detail_allowed_methods = ['get', 'post', 'put', 'delete','patch'] 
     authentication = ApiKeyAuthentication() 
     filtering = { 
      'username': ALL, 
     } 

如果我使用content-type application/JSON执行POST并且不包含client_image字段,它将成功创建一个新的Client对象。这表明模型/资源正在按照他们应该的方式工作。

然而,当我尝试使用的multipart/form-data的内容类型,我可以看到它在我的解串器适当获取与此有效载荷:

------WebKitFormBoundaryp0Q7Q9djlsvVGwbb 
Content-Disposition: form-data; name="{%0D%0A%22account%22" 

"/api/v1/account/account-info/21/", 

------WebKitFormBoundaryp0Q7Q9djlsvVGwbb 
Content-Disposition: form-data; name="client_image"; filename="donavan.jpg" 
Content-Type: image/jpeg 

------WebKitFormBoundaryp0Q7Q9djlsvVGwbb-- 

我也看到这个的QueryDict在调试时,这显示InMemoryUploadedFile正确:

<QueryDict: {u'client_image': [<InMemoryUploadedFile: donavan.jpg (image/jpeg)>], u'{%0D%0A%22account%22': [u'"/api/v1/account/account-info/21/"']}> 

,但我不断收到此错误:

{ error_message: "" traceback: "Traceback (most recent call last): File "/Users/stevewirig/Documents/www/vu/venv/lib/python2.7/site-packages/tastypie/resources.py", line 202, in wrapper response = callback(request, *args, **kwargs) File "/Users/stevewirig/Documents/www/vu/venv/lib/python2.7/site-packages/tastypie/resources.py", line 440, in dispatch_list return self.dispatch('list', request, **kwargs) File "/Users/stevewirig/Documents/www/vu/venv/lib/python2.7/site-packages/tastypie/resources.py", line 472, in dispatch response = method(request, **kwargs) File "/Users/stevewirig/Documents/www/vu/venv/lib/python2.7/site-packages/tastypie/resources.py", line 1328, in post_list updated_bundle = self.obj_create(bundle, **self.remove_api_resource_names(kwargs)) File "/Users/stevewirig/Documents/www/vu/venv/lib/python2.7/site-packages/tastypie/resources.py", line 2104, in obj_create bundle = self.full_hydrate(bundle) File "/Users/stevewirig/Documents/www/vu/venv/lib/python2.7/site-packages/tastypie/resources.py", line 890, in full_hydrate value = field_object.hydrate(bundle) File "/Users/stevewirig/Documents/www/vu/venv/lib/python2.7/site-packages/tastypie/fields.py", line 732, in hydrate value = super(ToOneField, self).hydrate(bundle) File "/Users/stevewirig/Documents/www/vu/venv/lib/python2.7/site-packages/tastypie/fields.py", line 165, in hydrate elif self.attribute and getattr(bundle.obj, self.attribute, None): File "/Users/stevewirig/Documents/www/vu/venv/lib/python2.7/site-packages/django/db/models/fields/related.py", line 343, in get raise self.field.rel.to.DoesNotExist DoesNotExist " }

任何想法,这可能会被打破?提前致谢!

回答

0

这发生在我发布数据时没有提供必要的字段。发布时必须提供那些不能为空的字段。

相关问题