2017-08-14 10 views
0

私はTastypieを持つDjangoアプリを持っています。主にBackBoneクライアント側です。私のモデルの1つにいくつかの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を使用すると、バーにアクセスできるURIを返すためにMEDIA_URLがファイル名に追加されます。しかし、行のbazの値を変更してからPUTリクエストを行うと、バーの値もURIに変更されます。つまり、次回にGET行を追加すると、MEDIA_URLが再び追加され、システムが切断され、連続するGETおよびPUTごとに追加されます。私はDBのように見える値のバーで終わる。

私はPUT要求があった場合、それはURIまたは実際のファイルのいずれかを取得していますことを認識し、何らかの方法でその動作を変更するように私は、私のModelResourceでメソッドをオーバーライドすることで、この問題を解決すべきだと思う
/media/media/media/bar.jpg 

これは正しい修正ですか?修正の実装の詳細をいくつか教えてください。

答えて

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する必要がある場合、これが考慮されていないと、エラーが発生する可能性があります。

関連する問題