Django REST Framework中perform_create获取字段报错:无start_date属性
在Django REST Framework的perform_create中获取用户输入数据的解决方案
嘿,我明白你遇到的问题了!在Django REST Framework(DRF)里,获取用户输入的数据和Django普通表单的方式确实不一样——你不能直接通过serializer.字段名来访问,得从序列化器的validated_data字典里取,这就是你报错'TaskSerializer' object has no attribute 'start_date'的原因。
问题根源
DRF的序列化器在接收并验证完用户提交的数据后,会把经过校验、格式合法的干净数据存储在validated_data这个字典中。你之前直接访问serializer.start_date,相当于在序列化器对象上找一个不存在的属性,自然会报错。
修改后的代码示例
这里给你两种可行的修改方式,你可以根据习惯选择:
方式一:修改validated_data后保存
from datetime import date def perform_create(self, serializer): # 从validated_data中获取验证后的start_date start_date = serializer.validated_data.get('start_date') if start_date > date.today(): # 将status添加到validated_data中 serializer.validated_data['status'] = "Schedule" # 保存时传入当前用户 serializer.save(user=self.request.user)
方式二:保存时直接传递额外参数
DRF的save()方法支持传入额外的关键字参数,这些参数会覆盖validated_data中的对应值(如果存在),用法更简洁:
from datetime import date def perform_create(self, serializer): start_date = serializer.validated_data.get('start_date') # 初始化status为默认值,或者直接从validated_data取 status = serializer.validated_data.get('status') if start_date > date.today(): status = "Schedule" # 保存时同时传入user和status serializer.save(user=self.request.user, status=status)
额外提示
- 永远优先使用
validated_data来获取用户输入,因为它是经过序列化器验证过的安全数据,避免了未校验数据带来的错误。 - 如果出于特殊需求需要访问未经过验证的原始数据,可以用
serializer.data,但不推荐在业务逻辑中使用,因为数据可能不符合模型字段的要求。
内容的提问来源于stack exchange,提问作者user13843526
相关产品推荐
相关产品推荐

