2017-07-21 10 views
3

配列の代わりに辞書として外部キーをシリアル化しようとしています。それは可能ですシリアライザに直接それを行うか、私が持っているためにdjango-restframeworkは、配列ではなく辞書としてリレーションシリアライズ

{ 
"en": { 
    "children": { 
     "pants": { 
      "children": { 
       "products/:level1": { 
        "children": { 
         ":level2/:level3": { 
          "children": {} 
         } 
        } 
       } 
      }, 
      ":productSlug": { 
       "children": {} 
      } 
     ] 
    } 
} 
} 

{ 
"slug": "en", 
"children": [{ 
     "slug": "pants", 
     "children": [{ 
       "slug": "products/:level1", 
       "children": [{ 
        "slug": ":level2/:level3", 
        "children": [] 
       }] 
      }, 
      { 
       "slug": ":productSlug", 
       "children": [] 
      } 
     ] 
    }, 
    { 
     "slug": "pullovers", 
     "children": [] 
    } 
    ] 
} 

しかし、私はそれがキーとしてナメクジを使用したい: は今JSONは以下になります追加のステップでそれを変換するには?

答えて

1

このanswerで提案したように、list serializersを上書きし、それを必要とするシリアライザごとにlist_serializer_classに設定することは可能です。もちろん

、あなたは少しそれを適応させる必要があります。

class <YourClass>ListSerializer(serializers.ListSerializer): 
    def to_representation(self, data): 
     r = super().to_representation(data) 

     return { item['<key_field>']: item for item in r } 
+0

良い答え。私はそれを少し微調整しなければならなかったので、私はトップレベルのためにもそれを使用することができました。私の答えを見てください。 – melbic

1

@Michael Rigonis答え(https://stackoverflow.com/a/45238191/270265)が成功への鍵となりました。私はそれを少し微調整しなければならなかったので、私は最高レベルのためにそれを使用することもできました。:

class DictSerializer(serializers.ListSerializer): 
    key = None 

    def __init__(self, *args, **kwargs): 
     self.key = kwargs.pop('key', self.key) 
     super().__init__(*args, **kwargs) 

    def to_representation(self, data):  
     r = super().to_representation(data) 
     return {item[self.key]: item for item in r} 

    @property 
    def data(self): 
     # This is a bit nasty, because the only "Many-Serializer" is a ListSerializer we inherit of it, 
     # but when converting it to json we call the BaseSerializer directly, because we want a Dictionary rather then a list 
     ret = super(serializers.ListSerializer, self).data 
     return ReturnDict(ret, serializer=self) 
+0

DRFコードを見ると、実際には 'data'に' ReturnDict'を使う必要があるようです。 –

関連する問題