我有这个 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/