2017-08-14 46 views
0

我有一个Django应用程序与Tastypie,主要是BackBone客户端。我的一个模型有几个ImageField。这里有一个类似的设置来帮助我解释这个问题。Django Tastypie阻止文件uri被保存到FileField

settings.py

MEDIA_URL = "/media/" 

models.py

class Foo(models.model): 
    bar = models.ImageField() 
    baz = models.CharField() 

api.py

class FooResource(ModelResource): 
    class Meta: 
     queryset=models.Foo.objects.all() 
     resource_name = "foo" 
     authorization = Authorization() 

当我做一个GET请求该API会将MEDIA_URL附加到文件名以返回可以访问条的URI。但是,当我在一行上更改baz的值,然后使用该值进行PUT请求时,它也会将条的值更改为URI。这意味着我下一次获取行时,它会再次附加MEDIA_URL,破坏系统并为每个连续的GET和PUT添加它。我最终得到了数据库中bar的值。

/media/media/media/bar.jpg 

我想我应该在我的ModelResource覆盖的方法解决这个问题,所以,当有一个PUT请求,它承认它变得既URI或一个真正的文件,并改变以某种方式其行为。

这是正确的修复方法吗?你能否提供一些修复的实施细节?

回答

0

我找到了答案。 Tastypie设计良好,与Django类似。不幸的是,我不熟悉术语,所以当我阅读我不明白的文档时。您可以在很多级别轻松修改API的行为。这是我的新API定义,它解决了这个问题。

api.py

class FooResource(ModelResource): 
    class Meta: 
     queryset=models.Foo.objects.all() 
     resource_name = "foo" 
     authorization = Authorization() 

    def hydrate_bar(bundle): 
     bundle["bar"] = bundle["bar"].strip(MEDIA_URL) 
     return bundle 

我要补充,这不仅对我的作品,因为我完全独立后我的图像文件不调用此方法的post_detail方法。如果我将POST或PUT图像文件作为整个行的一部分,我预计这可能会引发错误,如果没有考虑。