Django Tastypie阻止文件uri被保存到FileField

时间:2017-08-14 12:30:42

标签: django-models tastypie

我有一个使用Tastypie的Django应用程序,主要是BackBone客户端。我的一个模型有一些ImageFields。这是一个类似的设置,以帮助我解释这个问题。

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()

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

/media/media/media/bar.jpg

我想我应该通过覆盖我的ModelResource中的方法来解决这个问题,这样当有PUT请求时,它会识别出它正在获取URI或真实文件,并以某种方式改变其行为。

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

1 个答案:

答案 0 :(得分: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我的图像文件,该方法不会调用此方法。如果我将POST或PUT图像文件作为整行的一部分,我认为如果不考虑这可能会引发错误。