【问题标题】:Django Tastypie prevent file uri's being saved to a FileFieldDjango Tastypie 防止文件 uri 被保存到 FileField
【发布时间】:2017-08-14 12:30:41
【问题描述】:

我有一个带有 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 请求时,它也会将 bar 的值更改为 URI。这意味着下次我获取该行时,它会再次附加 MEDIA_URL,破坏系统并为每个连续的 GET 和 PUT 附加它。我最终得到了 DB 中 bar 的值。

/media/media/media/bar.jpg

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

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

【问题讨论】:

    标签: django-models tastypie


    【解决方案1】:

    我找到了答案。 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 图像文件作为整行的一部分,我预计如果不考虑这可能会引发错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 2014-08-09
      • 2011-08-15
      相关资源
      最近更新 更多