0

Djangoの新機能です。クラスベースのビューを使用するとこれが可能かどうかはわかりませんが、返されたJSONの値に基づいて検索結果をグループ化したいクエリ。基本的に私は私の結果はこれから行きたい:これに値に基づくグループ化シリアライザ結果

{ 
"id": "0038", 
"attributes": [ 
    { 
     "name": "State", 
     "values": "CA" 
    }, 
    { 
     "name": "Areas", 
     "values": "Value 1" 
    }, 
    { 
     "name": "Areas", 
     "values": "Value 2" 
    }, 
    { 
     "name": "Areas", 
     "values": "Value 3" 
    }]} 

{"id": "0038", 
"attributes": [ 
    { 
     "name": "State Licenses", 
     "values": "CA" 
    }, 
    { 
     "name": "Areas", 
     "values": ["Value 1", "Value 2", "Value 3"] 
    }]} 

各「名前/値」のペアは、MySQLデータベース内の個別の行です。私はそれを行うことができますどのように

class AttributeSerializer(serializers.ModelSerializer): 
    name = serializers.CharField(source='name') 
    values = serializers.CharField(source='value') 
    class Meta: 
     model = models.Attribute 
     fields= ('name','values') 

任意のアイデア:シリアライザがどのように見えるものの

class Attribute(models.Model): 
    id = models.AutoField(primary_key=True) 
    name = models.CharField(max_length=45, blank=False) 
    value = models.CharField(max_length=255, blank=False) 

:私のmodels.pyは次のようになりますか? ListSerializerはおそらく候補者かもしれないと思われます。延長によってもmany=Trueが追加されますが、私が望むグループ化の動作を提供するとは思われません。何か案は?

+0

ハッシュテーブルには重複するキーが存在しないため、提案は機能しません。これはあなたのケースでは「値」です。 –

+0

グループ化が必要な場合、デフォルトのシリアライザでは、カスタマイズ結果を必要とするため単純に行うことができない場合があります。独自のシリアライザを書くことができます。 –

+0

私が探していたJSONを明確にするために編集しました。 –

答えて

0

普通のSerializerを使用してください。これはではありません。view's methodsを上書きして独自の構造を作成し、シリアライザに渡します。

0

ListSerializer.to_representationを上書きする必要があります。 docs.to_representationを無効にする方法の詳細をご覧ください。

def transform_data(data): 
    result = {} 
    for item in data: 
     name, value = item['name'], item['value'] 
     if result.get(name): 
      result[name].append(value) 
     else: 
      result[name] = [value] 
    return result 


class AttributeListSerializer(serializers.ListSerializer): 
    def to_representation(self, data): 
     data = super(AttributeListSerializer, self).to_representation(data) 
     # data is currently in this format: 
     # [ 
     #  {"name": "State", "values": "CA"}, 
     #  {"name": "Areas", "values": "1"}, 
     # ] 
     # transform_data can be updated to transform the data however you like... 
     return transform_data(data) 


class AttributeSerializer(serializers.ModelSerializer): 
    name = serializers.CharField(source='name') 
    values = serializers.CharField(source='value') 
    class Meta: 
     model = models.Attribute 
     fields= ('name','values') 
     # the below is KEY 
     list_serializer_class = AttributeListSerializer 
関連する問題