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

Django 2.0 第一类视图报错:AttributeError: 'str' object has no attribute 'values'

排查Django REST Framework中AttributeError: 'str' object has no attribute 'values'的问题

嘿,我来帮你捋捋这个问题——这个错误几乎都是因为把字符串当成了模型类/查询集对象传给了DRF的视图或序列化器,导致框架在调用values()这类查询集方法时出错。咱们从几个常见的排查点入手:

1. 检查序列化器的Meta.model配置

这是最容易踩的坑:如果你在ModelSerializer的Meta类里,把model写成了字符串(比如"myapp.MyModel"),而不是导入实际的模型类,DRF就会把它当成普通字符串处理,后续执行到需要模型查询的逻辑时就会报错。

❌ 错误写法:

class MyModelSerializer(ModelSerializer):
    class Meta:
        model = "myapp.MyModel"  # 这里用了字符串,不是实际的模型类
        fields = "__all__"

✅ 修正写法:

from myapp.models import MyModel  # 先导入模型类

class MyModelSerializer(ModelSerializer):
    class Meta:
        model = MyModel
        fields = "__all__"

2. 检查视图的queryset属性

如果你的通用视图(比如你写的StandardRudApiView)里,queryset被赋值成了字符串(比如"MyModel.objects.all()"),而不是实际的查询集对象,也会触发这个错误。DRF需要的是QuerySet实例,不是字符串形式的代码。

❌ 错误写法:

class StandardRudApiView(generics.RetrieveUpdateDestroyAPIView):
    queryset = "MyModel.objects.all()"  # 错误:字符串不是查询集
    serializer_class = MyModelSerializer

✅ 修正写法:

from myapp.models import MyModel

class StandardRudApiView(generics.RetrieveUpdateDestroyAPIView):
    queryset = MyModel.objects.all()  # 这里是实际的QuerySet对象
    serializer_class = MyModelSerializer

3. 检查重写的get_queryset()方法

如果你在视图里重写了get_queryset(),不小心返回了字符串(比如调试时的遗留代码、拼写错误),同样会导致这个问题。

❌ 错误写法:

class StandardListMixinCreateApiView(mixins.CreateModelMixin, generics.ListAPIView):
    serializer_class = MyModelSerializer

    def get_queryset(self):
        # 错误:返回了字符串而非QuerySet
        return "MyModel.objects.filter(created_by=self.request.user)"
    
    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

✅ 修正写法:

class StandardListMixinCreateApiView(mixins.CreateModelMixin, generics.ListAPIView):
    serializer_class = MyModelSerializer

    def get_queryset(self):
        return MyModel.objects.filter(created_by=self.request.user)  # 返回QuerySet
    
    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

另外,你给出的StandardRudApiView代码没写完,记得确保它正确继承了generics.RetrieveUpdateDestroyAPIView,并且配置好queryset和serializer_class这两个核心属性哦。

内容的提问来源于stack exchange,提问作者Steffen22

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:50:46