2016-04-28 11 views
1

Djangoを初めて謝罪します。私は文書を精練しており、これに対する答えを見つけることができませんでした。Djangoシリアライザディスプレイモデルフィールドを辞書として

フィールド "bar"を持つモデル "Foo"があります。これは、JSFとしてTextFieldに保存する辞書です。このフィールドを辞書として表示するGETリクエストが必要ですが、リクエストを行うと、辞書はJSON形式の単一の文字列として表示されます。

モデル::

class Foo(models.Model): 
    bar = models.TextField(blank=True, default="{}") 
    def getBar(self): 
     return json.loads(bar) 

シリアライザ:

class FooSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Foo 
     fields = ("bar") 
     read_only_fields = ("bar") 
    def create(self, data): 
     return Foo.objects.create(**data) 

ビュー:

class FooList(generics.ListAPIView): 
    queryset = [] 
    for foo in Foo.objects.all(): 
     foo.bar = json.loads(foo.bar) 
     # Printing type of foo.bar here gives "type <dict>" 
     queryset.append(foo) 
    serializer_class = FooSerializer 

おかげ

は私のコードを要約します!

答えて

1

あなたは以下のようなあなたのModelSerializerクラスにSerializerMethodFieldを追加することができます。

class FooSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Foo 
     fields = ('bar',) 
     read_only_fields = ('bar',) # Not required, because 
            # SerializerMethodField is read-only already 

    bar = serializers.SerializerMethodField('get_bar_dict') 

    def get_bar_dict(self, obj): 
     return json.loads(obj.bar) # This gets the dict and returns it 
            # to the SerializerMethodField above 

    # Below is the rest of your code that I didn't touch 
    def create(self, data): 
     return Foo.objects.create(**data) 
+0

は、完全にドキュメントへのリンクのおかげで働きました! – Kieran

関連する問題