2013-08-02 6 views
7

Ho un modello di Django che è come questo:Come si può personalizzare l'uscita dei serializzatori di Django Rest Framework?

class WindowsMacAddress(models.Model): 
    address = models.TextField(unique=True) 
    mapping = models.ForeignKey('imaging.WindowsMapping', related_name='macAddresses') 

E due serializzatori, definito come:

class WindowsFlatMacAddressSerializer(serializers.Serializer): 
    address = serializers.Field() 

class WindowsCompleteMappingSerializer(serializers.Serializer): 
    id = serializers.Field() 
    macAddresses = WindowsFlatMacAddressSerializer(many=True) 
    clientId = serializers.Field() 

Quando si accede al serializzatore su una vista, ottengo il seguente output:

[ 
    { 
     "id": 1, 
     "macAddresses": [ 
      { 
       "address": "aa:aa:aa:aa:aa:aa" 
      }, 
      { 
       "address": "bb:bb:bb:bb:bb:bb" 
      } 
     ], 
     "clientId": null 
    } 
] 

Quasi buono, tranne che io preferirei avere:

[ 
    { 
     "id": 1, 
     "macAddresses": [ 
      "aa:aa:aa:aa:aa:aa", 
      "bb:bb:bb:bb:bb:bb" 
     ], 
     "clientId": null 
    } 
] 

Come posso ottenere quello?

risposta

11

Creare un custom serializer field e implementare to_native in modo che restituisca l'elenco desiderato.

Se si utilizza il source="*" technique poi qualcosa di simile potrebbe funzionare:

class CustomField(Field): 
    def to_native(self, obj): 
     return obj.macAddresses.all() 

Mi auguro che aiuta.

+0

Tutti i collegamenti forniti sono corretti, potresti aggiornarlo – vimal1083

+0

Ecco qui. –

6

La risposta di Carlton funzionerà correttamente. Ci sono anche un paio di altri approcci che potresti intraprendere.

È inoltre possibile utilizzare SlugRelatedField, che rappresenta la relazione, utilizzando un determinato campo sulla destinazione.

Così, per esempio ...

class WindowsCompleteMappingSerializer(serializers.Serializer): 
    id = serializers.Field() 
    macAddresses = serializers.SlugRelatedField(slug_field='address', many=True, read_only=True) 
    clientId = serializers.Field() 

In alternativa, se il __str__ del WindowsMacAddress visualizza semplicemente l'indirizzo, allora si potrebbe usare semplicemente RelatedField, che è un campo di sola lettura di base che vi darà un rappresentazione semplice della stringa del target di relazione.

# models.py 
class WindowsMacAddress(models.Model): 
    address = models.TextField(unique=True) 
    mapping = models.ForeignKey('imaging.WindowsMapping', related_name='macAddresses') 

    def __str__(self): 
     return self.address 

# serializers.py 
class WindowsCompleteMappingSerializer(serializers.Serializer): 
    id = serializers.Field() 
    macAddresses = serializers.RelatedField(many=True) 
    clientId = serializers.Field() 

Date uno sguardo attraverso il documentation on serializer fields per avere una migliore idea dei vari modi per rappresentare relazioni nella vostra API.

+0

Hmm Ho pensato che 'RelatedField' e' SlugRelatedField' funzionano solo con 'ModelSerializer'? –

+0

Tutti i campi relazionali funzionano con le relazioni del modello Django. Funzioneranno perfettamente o utilizzati su una classe 'Serializer' o' ModelSerializer'. –

+0

Grazie! Sarà utile per me più tardi. –

Problemi correlati