2016-04-22 15 views
1

シナリオ:Amazon S3をS3 Botoを使用するデフォルトストレージとして使用していて、すべてのファイルが'media'フォルダーに移動します。DjangoがAWS S3を使用してFileFieldをファイルURLにシリアライズしない理由

質問:私はserializers.serializeを使用してJSONに私のFileFieldにを含むモデルをシリアル化していたとき、私はJSONに入るすべてが「メディア/ abc.png」またはその種のものです。相対パスの代わりにjsonでファイルURLを自動的に取得する方法はありますか?または毎回json応答にURLを手動で追加する必要がありますか?

答えて

1

DjangoはFile objects、StoragesおよびFileFieldで動作します。 Filefieldはファイルのためのある種のストレージ識別子を保存します。この識別子は、ストレージがファイルの正しい場所を見つけるのに役立ちます。デフォルトでは、シリアライザはその識別子のみを取得します。その識別子はdjangoファイルオブジェクトの文字列表現です。私はすでにこのラインの上で考えていた

from django.core import serializers 
from django.db import models 

JSONSerializer = serializers.get_serializer("json") 

JSONWithURLSerializer(JSONSerializer): 

    def handle_field(self, obj, field): 
     value = field.value_from_object(obj) 
     if isinstance(field, models.FileField) and hasattr('url', value): 
      self._current[field.name] = value.url 
     else: 
      return super(JSONWithURLSerializer, self).handle_field(obj, field) 

serializer = JSONWithURLSerializer() 
serializer.serialize(queryset) 
data = serializer.getvalue() 
+0

:URLを返すようにしたい場合は

は、あなたは、シリアライザメソッドをオーバーライドする必要があります。答えをありがとう。 – r3ign

+0

djangoはこれをそのままの状態でサポートしていないのですか?私は、デフォルトでは、すべてのファイルが自動的にMEDIA_ROOT + Rel.PATHを指すはずであると感じています。 – r3ign

関連する問題