django - SerializerMethodField DRF 中 obj 参数的类型

标签 django django-rest-framework

我有这个 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 实例并且没有“Patient_id”属性。为什么这个对象在不同的​​请求方法中会改变类型?

最佳答案

当您执行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()

关于django - SerializerMethodField DRF 中 obj 参数的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47807854/

相关文章:

django - Django 如何知道将哪些值放入测试数据库

python - Django/python 按月和季度进行日期聚合

python - sorl-缩略图语法错误

javascript - Django,如何为网站上显示的脚本制作下载按钮

python - 我如何跳过 token 身份验证类仅获取请求djangorest框架

Django Rest Framework 使用 PrimaryKeyRelatedField 返回嵌套对象

python - Django 查询详情 View

python - Django 休息框架以编程方式填充嵌套对象的字段

python - Django rest framework : serializers. ReadOnlyField() 不在可浏览的 api 中显示字段

json - JSONRenderer无法序列化:b'{“id”:“11122211133311”}}不可JSON序列化