2017-03-01 4 views
2

나는 코칭 시스템을 구현하려고하는데 django의 직렬화에 대해 약간의 실수가 있습니다. 저는 많은 것을 통해 모델을 통해 약속을 제어 할 수 있습니다. 코치/코치는 관계에 관여합니다.django many to many

class Appointment(models.Model): 
    """docstring for Appointment""" 
    coach = models.ForeignKey(User, related_name='coaches', on_delete=models.CASCADE) 
    coachee = models.ForeignKey(User, related_name='coachees', on_delete=models.CASCADE) 
    schedule_date = models.DateField(auto_now=False, auto_now_add=True, blank=True) 
    due_date = models.DateField() 
    summary = models.TextField(max_length=200) 

다음 시리얼 라이저를 사용하면 기본 키를 얻을 수 있지만 한 가지 요청으로 코치 및 코치 세부 정보를 얻고 싶습니다.

#return appointment data 
class AppointmentSerializer(serializers.HyperlinkedModelSerializer): 
    """docstring for AppointmentSerializer""" 
    class Meta: 
     model = Appointment 
     fields = ('id', 'schedule_date', 'due_date', 'coach', 'coachee', 'summary', 'condition') 
+0

와우이 빠르고 매우 유용했다. 깊이 = 1 옵션을 사용했는데 효과가있었습니다! 고마워요. 초보자로서 나는 정말로 모두의 도움에 감사한다. –

답변

1

Meta 클래스에 depth 옵션을 설정하십시오.

class AppointmentSerializer(serializers.HyperlinkedModelSerializer): 
    """docstring for AppointmentSerializer""" 
    class Meta: 
     model = Appointment 
     fields = ('id', 'schedule_date', 'due_date', 'coach', 'coachee', 'summary', 'condition') 
     depth = 1 

이렇게하면 중첩 된 표현이 생성됩니다.

더 많은 제어가 필요하면 명시 적으로 serializer를 지정할 수 있습니다.

class AppointmentSerializer(serializers.HyperlinkedModelSerializer): 
    coach = CoachSerializer() 
    coachee = CoacheeSerializer() 

    class Meta: 
     model = Appointment 
     fields = ('id', 'schedule_date', 'due_date', 'coach', 'coachee', 'summary', 'condition') 

또한 관련 모델에서 하나의 필드를 추가 할 수 있습니다 :

class AppointmentSerializer(serializers.HyperlinkedModelSerializer): 
    """docstring for AppointmentSerializer""" 
    coach_name = serializers.CharField(source='coach.name') 

    class Meta: 
     model = Appointment 
     fields = ('id', 'schedule_date', 'due_date', 'coach', 'coachee', 'summary', 'condition') 
1

몇 가지 방법이 있습니다.

class UserSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = User 
     fields = ... 

class AppointmentSerializer(serializers.ModelSerializer): 
    coach = UserSerializer() 
    coachee = UserSerializer() 

    class Meta: 
     model = Appointment 
     fields = ('id', 'schedule_date', 'due_date', 'coach', 'coachee', 'summary', 'condition') 

을하지만 인스턴스를 생성하기위한 AppointmentSerializer을 사용하려는 경우 문제가 될 것입니다 : 일반적인 하나는 사용자의 시리얼을 생성하고 디폴트 필드 대신 사용할 수 있습니다. 사용자의 ID를 해당 필드로 전달할 수 없습니다. 이 경우 기본 입력란을 사용하고 to_representation 메소드를 재정의 할 수 있습니다.

class AppointmentSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Appointment 
     fields = ('id', 'schedule_date', 'due_date', 'coach', 'coachee', 'summary', 'condition') 

    def to_representation(self, instance): 
     representation = super(AppointmentSerializer, self).to_representation(instance) 
     representation['coach'] = UserSerializer(instance.coach).data 
     representation['coachee'] = UserSerializer(instance.coachee).data 
     return representation