Django Rest Framework创建订单时出现500内部服务器错误求助
问题排查:DRF创建订单返回500错误(AttributeError: 'QuerySet' object has no attribute 'first_name')
问题场景
开发React+Django电商项目,使用DRF+JWT认证,调用/api/order/add创建订单时返回500错误,报错栈显示AttributeError: 'QuerySet' object has no attribute 'first_name'。
问题根源
在serializers.py的OrderSerializer类中,get_user方法存在逻辑错误:
def get_user(self,obj): user =User.objects.all() # 错误:获取了所有用户的QuerySet集合 serializer = UserSerializer(user, many = False) # 错误:用单个实例序列化器处理集合 return serializer.data
User.objects.all()返回的是所有用户的QuerySet集合,但UserSerializer(many=False)需要单个User实例UserSerializer的get_name方法尝试访问obj.first_name,而QuerySet是集合对象,没有该属性,直接触发报错- 从Order模型定义来看,
user是ForeignKey(多对一关联),每个订单仅关联一个用户,无需查询所有用户
修复方案
修改OrderSerializer的get_user方法,直接获取当前订单关联的单个用户对象:
def get_user(self,obj): # 直接获取订单关联的单个用户 user = obj.user # 考虑到Order模型中user允许为null,增加空值判断 if user: serializer = UserSerializer(user, many=False) return serializer.data return None # 或返回空字典,根据业务需求调整
额外优化建议
原get_shippingAddress方法存在返回序列化器实例而非序列化数据的问题,同时捕获异常范围过大,建议调整:
def get_shippingAddress(self,obj): try: # 注意要调用.data获取序列化后的结果 address = ShippingAddressSerializer(obj.shippingAddress, many=False).data except ShippingAddress.DoesNotExist: address = None return address
内容的提问来源于stack exchange,提问作者Marilyn Marquez
相关产品推荐
相关产品推荐

