0

Ich bin relativ neu zu Django, so kann ich nicht sagen, ob dies mit einer klassenbasierten Ansicht möglich ist, aber ich möchte Suchergebnisse basierend auf einem Wert in der JSON von zurückgegeben werden die Abfrage. Grundsätzlich mag ich meine Ergebnisse aus diesem gehen:Group Serializer Ergebnisse basierend auf Wert

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

Um dies:

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

Jedes "Namen/Wert" Paar ist eine separate Zeile in einer MySQL-Datenbank. Mein models.py wie folgt aussieht:

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) 

Während die Serializer wie folgt aussieht:

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

eine Ahnung, wie ich das tun kann? ListSerializer scheint ein wahrscheinlicher Kandidat zu sein, und durch die Erweiterung wird auch das Hinzufügen von many=True hinzugefügt, aber ich denke nicht, dass dies das gewünschte Gruppierungsverhalten bietet. Irgendwelche Ideen?

+0

Ihr Vorschlag wird nicht funktionieren, weil eine Hashtabelle keine doppelten Schlüssel haben sollte, was in Ihrem Fall "Werte" ist. –

+0

Wenn Sie gruppieren möchten, ist der Standard-Serializer möglicherweise nicht in der Lage, dies zu tun, nur weil Sie ein angepasstes Ergebnis wünschen. Sie können Ihren eigenen Serializer schreiben. –

+0

Bearbeitet, um zu klären, was JSON ich suchte. –

Antwort

0

Verwenden Sie eine reguläre Serializer - das heißt, keine ModelSerializer - und überschreiben Sie die view's methods, um Ihre eigene Struktur zu erstellen und an den Serializer zu übergeben.

0

Sie müssen die ListSerializer.to_representation überschreiben. Lesen Sie mehr über das Überschreiben .to_representation in der docs.

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