2017-03-01 30 views
2

私はコーチングシステムを実装しようとしていますが、私はdjangoのシリアライゼーションについて少し迷っています。私は予定を管理するために多くのモデルを使用しています。その関係に関わるコーチ/コーチェシ。django多対多

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) 

次のシリアライザを使用すると、プライマリキーを取得できますが、1回のリクエストでコーチとコーチェストの詳細を取得したいと思っています。

#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

うわー、これは速く、非常に便利でした。私はdepth = 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 

これにより、ネストされた表現が生成されます。

さらに制御が必要な場合は、シリアライザを明示的に指定することもできます。

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