18

Could anyone give a complete example on using the tastypie FileField, both server-side and client-side please?

Here's what I have tried:

#models.py
class Foo(models.Model):
    img = models.ImageField(upload_to="images", null=True, blank=True)
    body = models.CharField()

#api.py
class FooResource(ModelResource):
    img = fields.FileField(attribute="image", null=True, blank=True)
    class Meta:
        queryset = Foo.objects.all()

If I try to create a foo object using curl, e.g.,

>>> curl -F "body=test" -F "img=@local_img.png" http://localhost:8000/api/0.1/foo/

A foo object is successfully created, but the img field is null. I can see in debugger that when saving the bundle object indeed has a img field which contains a InMemoryUploadedFile object, so the request is probably ok. Where am I doing wrong? Code snippets are most welcome, thanks!

Serjik
  • 10,543
  • 8
  • 61
  • 70
blurrcat
  • 1,278
  • 13
  • 23

1 Answers1

22

Your Resources should look like this:

class FooResource(ModelResource):
    img = fields.FileField(attribute="img", null=True, blank=True)
    class Meta:
        queryset = Foo.objects.all()

The attribute should correspond to the field in the model. As stated in the documentation:

ApiField.attribute

A string naming an instance attribute of the object wrapped by the Resource.

Ania Warzecha
  • 1,796
  • 13
  • 26
  • When I do this, I get the error: `The format indicated 'multipart/form-data' had no available deserialization method.` Am I missing something simple? – Racing Tadpole Jun 17 '13 at 01:39
  • 1
    I found a solution to the missing deserialization error [here](http://stackoverflow.com/questions/12522332/how-to-access-post-data-inside-tastypie-custom-authentication), based on [this github post](https://github.com/toastdriven/django-tastypie/issues/42#issuecomment-5485666). – Racing Tadpole Jun 19 '13 at 02:02