DjangoRestFramework报错:Got AttributeError when attempting to get a value for field `name` on serializ

在使用DRF序列化器时,通过网页端,访问数据列表时提示:
Got AttributeError when attempting to get a value for field name on serializer StudentSerializers.
The serializer field might be named incorrectly and not match any attribute or key on the QuerySet instance.
Original exception text was: ‘QuerySet’ object has no attribute ‘name’.

代码如下:


@api_view(['get', 'post'])
def student_create_list(request, format=None):
  
    if request.method == 'GET':
        # 获取所有的学生
        objs = Student.objects.all()
        # 序列化
        serializer = StudentSerializers(instance=objs)
        # 返回 drf 的响应
        return Response(serializer.data)

    elif request.method == 'POST':
        # 创建学生
        data = request.data
        # 创建序列化器
        serializer = StudentSerializers(data=data)

        # 校验
        if serializer.is_valid():
            serializer.save()
            # 返回获取到的数据
            return Response(data=serializer.data, status=status.HTTP_201_CREATED)

        else:
            # 返回报错的内容
            return Response(data=serializer.errors, status=status.HTTP_400_BAD_REQUEST)

报错内容如下
在这里插入图片描述
解决方法:
serializer = StudentSerializers(instance=objs, many=True)

在这里插入图片描述
至此完美解决问题:
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据误消息,问题出现在名为`phone`的字段上,该字段在`UserMySerializer`序列化器中。误提示指出 `'AnonymousUser' object has no attribute 'phone'`,即`AnonymousUser`对象没有`phone`属性。 这个误通常表示在你的代码中,你正在尝试使用一个匿名用户(即未经身份验证的用户)来访问一个需要`phone`属性的地方。匿名用户没有这个属性,因此会引发该误。 要解决这个问题,你可以采取以下步骤: 1. 确保用户已经登录并且身份验证成功。你可以在处理请求的视图函数或类中使用适当的身份验证类或装饰器来验证用户身份。 2. 检查你的代码中是否有地方在未经身份验证的情况下尝试访问`phone`属性。确认在访问该属性之前进行了适当的身份验证。 3. 如果你希望在匿名用户的情况下允许访问该属性,你可以在序列化器中对该字段进行特殊处理。例如,你可以使用`SerializerMethodField`来定义一个自定义方法来返回匿名用户的默认值。 以下是一个示例代码片段来解决这个问题: ```python from rest_framework import serializers class UserMySerializer(serializers.ModelSerializer): phone = serializers.SerializerMethodField() def get_phone(self, obj): if self.context['request'].user.is_anonymous: return 'N/A' # 或者返回你希望的默认值 return obj.phone class Meta: model = User fields = ['phone', ...] # 其他字段 ``` 在上面的代码中,我们在`UserMySerializer`中使用了`SerializerMethodField`来定义一个名为`phone`的字段,并在`get_phone`方法中进行了特殊处理。如果请求的用户是匿名用户,我们返回一个默认值(例如"N/A"),否则返回用户对象的实际`phone`属性值。 通过这种方式,你可以确保在匿名用户的情况下不会引发该误,并在需要时提供适当的默认值。记得根据你的具体需求进行适当的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值