2016-06-23 9 views
11

Ich entwickle eine API mit Django Rest Framework, und ich möchte die Felder dynamisch aus einem Serializer entfernen. Das Problem ist, dass ich sie abhängig vom Wert eines anderen Feldes entfernen muss. Wie könnte ich das tun? Ich habe einen Serializer wie:Wie man Felder dynamisch aus der Serializer-Ausgabe entfernt

class DynamicSerliazer(serializers.ModelSerializer): 
    type = serializers.SerializerMethodField() 
    url = serializers.SerializerMethodField() 
    title = serializers.SerializerMethodField() 
    elements = serializers.SerializerMethodField() 

    def __init__(self, *args, **kwargs): 
     super(DynamicSerliazer, self).__init__(*args, **kwargs) 
     if self.fields and is_mobile_platform(self.context.get('request', None)) and "url" in self.fields: 
      self.fields.pop("url") 

Wie Sie sehen können, bin ich schon das Feld „url“ Entfernen je nachdem, ob die Anforderung von einer mobilen Plattform durchgeführt worden ist. Aber ich möchte das Feld "elements" abhängig vom "type" -Wert entfernen. Wie soll ich das machen?

Vielen Dank im Voraus

Antwort

13

Sie können customize the serialization behavior durch Überschreiben der to_representation() Methode in Ihrem Serializer.

class DynamicSerliazer(serializers.ModelSerializer): 

    def to_representation(self, obj): 
     # get the original representation 
     ret = super(DynamicSerializer, self).to_representation(obj) 

     # remove 'url' field if mobile request 
     if is_mobile_platform(self.context.get('request', None)): 
      ret.pop('url') 

     # here write the logic to check whether `elements` field is to be removed 
     # pop 'elements' from 'ret' if condition is True 

     # return the modified representation 
     return ret 
+1

Vielen Dank, das funktioniert wie ein Zauber – FVod

2

können Sie mehrere Serializer erstellen und die richtige ist in Sicht

class IndexView(APIView): 
    def get_serializer(self): 
     if self.request.GET['flag']: 
      return SerializerA 
     return SerializerB 

Verwendung Vererbung wählen, um Serializer zu machen trocken.

0

Mein Problem war ähnlich wie Ihres und ich löste es mit Vererbung.

class StaticSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = StaticModel 
     fields = (
      'first_name', 'last_name', 'password', 'username', 
      'email' 
     ) 


class DynamicSerializer(StaticSerializer): 

    class Meta: 
     model = StaticModel 
     fields = (
      'first_name', 
     ) 
Verwandte Themen