2014-07-20 1 views
1

나는 이것이 문서에서 아마있는 것처럼 느낀다. 그러나 나는 단지 그것을 이해하는 것처럼 보일 수 없다.Django REST Framework를 사용할 때 직렬기를 중첩 할 때 parent를 제외하는 방법은 무엇입니까?

fields에 ForeignKey가 포함 된 시리얼 라이저가있는 경우 해당 serializer가 관련 객체에 중첩되어있을 때 해당 FK를 제외하려면 어떻게해야합니까? 내가 http://0.0.0.0:8000/person/1/에서 API를 쳤을 때

class EmployerSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Employer 
     fields = ('name', 'person') 

class PersonSerializer(serializers.HyperlinkedModelSerializer): 
    employers = EmployerSerializer() 

    class Meta: 
     model = Person 
     fields = ('name', 'employers') 
     depth = 1 

그것은 뭔가를 나열

{ 
    "name": "Joe Blow", 
    "employers": { 
     "name": "Acme Inc." 
     "person": "http://0.0.0.0:8000/person/1/" 
     } 
} 

"고용주"의 "사람"키가 자기 참조 중복이지만, 시리얼 라이저가 중첩되어있는 경우에만 그것이 참조하고있는 객체.

serializer가 중첩되어있을 때 제외시킬 수있는 옵션이있는 것처럼 보이지만 알아낼 수는 없습니다.

답변

1
class DynamicFieldsModelSerializer(serializers.HyperlinkedModelSerializer): 
    """ 
    A HyperlinkedModelSerializer 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: 
      # 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: 
      # Drop fields that are specified in the `exclude` argument. 
      excluded = set(exclude) 
      for field_name in excluded: 
       try: 
        self.fields.pop(field_name) 
       except KeyError: 
        pass 

class EmployerSerializer(DynamicFieldsModelSerializer): 
    class Meta: 
     model = Employer 
     fields = ('name', 'person') 


class PersonSerializer(serializers.HyperlinkedModelSerializer): 
    employers = EmployerSerializer(exclude=('name',)) 
    class Meta: 
     model = Person 
     fields = ('name', 'employers') 
     depth = 1 
DynamicFieldsModelSerializer

으로 연장 EmployerSerializer
관련 문제