2017-10-19 2 views

Répondre

1
class DynamicFieldsModelSerializer(ModelSerializer): 
    """ 
    A ModelSerializer that takes an additional `fields` argument that 
    controls which fields should be displayed. 
    """ 

    def __init__(self, *args, **kwargs): 
     # Don't pass the 'fields' arg up to the superclass 
     fields = kwargs.pop('fields', None) 
     exclude = kwargs.pop('exclude', None) 

     # Instantiate the superclass normally 
     super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs) 

     if fields is not None: 
      # Drop any fields that are not specified in the `fields` argument. 
      allowed = set(fields) 
      existing = set(self.fields.keys()) 
      for field_name in existing - allowed: 
       self.fields.pop(field_name) 

     if exclude is not None: 
      not_allowed = set(exclude) 
      for exclude_name in not_allowed: 
       self.fields.pop(exclude_name) 


class KlassStudentSerializer(DynamicFieldsModelSerializer): 
    student = ProfileSerializer() 
    klass = KlassSerializer() 

    class Meta: 
     model = KlassStudents 
     fields = ['pk', 'student', 'klass'] 

utilisation comme:

serializer1 = KlassStudentSerializer(data=data, fields=('klass')) 
serializer2 = KlassStudentSerializer(data=data, fields=('student')) 

ou

serializer3 = KlassStudentSerializer(data=data, exclude=('id', 'klass')) 
serializer4 = KlassStudentSerializer(data=data, exclude=('id', 'student'))