You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:05:34