2016-06-23 15 views
11

Zajmuję się tworzeniem API z frameworkiem Django Rest i chciałbym dynamicznie usunąć pola z serializera. Problem polega na tym, że muszę je usunąć w zależności od wartości innego pola. Jak mogłem to zrobić? Mam serializatora jak:Jak dynamicznie usuwać pola z wyjścia serializatora

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") 

Jak widać, jestem już usuwając pole „URL” w zależności od tego, czy żądanie zostało zrobione z platformy mobilnej. Ale chciałbym usunąć pole "elements" w zależności od wartości "type". Jak mam to zrobić?

góry dzięki

Odpowiedz

13

You może customize the serialization behavior nadrzędnymi metodęto_representation() w serializatora.

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

Dziękuję bardzo, działa to jak urok – FVod

2

Można utworzyć wiele serializers i wybrać odpowiedni jeden ze względu

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

używać dziedziczenia aby serializers suche.

0

Mój problem był nieco podobny do twojego i rozwiązałem go z dziedziczeniem.

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', 
     ) 
Powiązane problemy