2017-12-14 5 views
3

私はこのDjangoのRESTフレームワークシリアライザクラスを持っている:タイプ

class DoctorMeetingSerializer(serializers.ModelSerializer): 

    doctor_id = serializers.CharField() 
    patient_id = serializers.CharField() 
    meetings_amount = serializers.SerializerMethodField() 

    class Meta: 
     model = DoctorMeeting 
     fields = (
      'id', 
      'doctor_id', 
      'patient_id', 
      'start_time', 
      'end_time', 
      'subject', 
      'meetings_amount', 
     ) 
     read_only_fields = ('zoom_meeting_id', 'is_live', 'meetings_amount',) 

    def get_meetings_amount(self, obj): 
     print(type(obj)) 
     meetings_amount = DoctorMeeting.objects.filter(patient=obj.patient_id).count() 

     return meetings_amount 

は私が要求をGET行う際に、印刷(タイプ(objが))objがシリアライザのインス​​タンスであることを示しているが、その後、I POST要求を行うと、objはOrderedDictインスタンスになり、 'patient_id'属性はありません。なぜこのオブジェクトは異なる要求メソッドで型を変更しますか?

+0

私は質問に同様にあなたの視野を投稿し、問題はあなたのビューであると思います。 – Satendra

+0

はい、ビューはジレンマかもしれませんが、次のようにしてdictを読むことができます。 **自己.__ dict __ ['initial_data'] ** –

答えて

0

POSTリクエストを実行すると、新しいオブジェクトを作成しようとしたことを意味します。つまり、インスタンスはNoneです。そして、データをソースの一部、詳細data propertyをここでは、唯一の辞書を使用DRFを生成するには:

if self.instance is not None and not getattr(self, '_errors', None): 
    self._data = self.to_representation(self.instance) 
elif hasattr(self, '_validated_data') and not getattr(self, '_errors', None): 
    self._data = self.to_representation(self.validated_data) 
else: 
    self._data = self.get_initial() 
+0

ありがとうございます、あなたが正しいようです。しかし、なぜ私はPOSTリクエストをしている間get_meetings_amount()の本体を評価するのだろうかと思っています。このフィールドは読み取り専用で、GET要求のみです。 –

+0

現在のメソッドが 'to_representation'を呼び出しています。ここで、' self._readable_fields'のループは 'write_only'以外のすべてのフィールドです。 –