【问题标题】:Type of obj argument in SerializerMethodField DRFSerializerMethodField DRF 中 obj 参数的类型
【发布时间】:2017-12-14 07:17:59
【问题描述】:

我有这个 Django REST Framework 序列化程序类:

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 请求时,print(type(obj)) 显示 obj 是序列化程序实例,但随后我执行 POST 请求,obj 成为 OrderedDict 实例并且没有“患者 ID”属性。为什么这个对象在不同的​​请求方法中会改变它的类型?

【问题讨论】:

  • 我想问题出在你的观点中,请发表你的观点。
  • 是的,视图可能是两难的,但您可以通过以下方式实现阅读字典。 self.__dict__['initial_data']

标签: django django-rest-framework


【解决方案1】:

当你做POST请求时,表示你尝试创建新对象,所以实例是None。而生成数据drf只用了dict,这里是部分源码,更多详情data property

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()

【讨论】:

  • 谢谢,看来你是对的。但我想知道为什么它甚至在执行 POST 请求时评估 get_meetings_amount() 的主体。该字段是只读的,它只用于 GET 请求。
  • 当你看到当前方法调用另一个to_representation where loop for self._readable_fields -- 所有不是write_only的字段
猜你喜欢
  • 1970-01-01
  • 2021-02-02
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 2017-09-30
  • 2012-02-09
相关资源
最近更新 更多