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

Django REST框架UserDetail视图AssertionError问题求助

问题:Django REST框架UserDetail视图抛出AssertionError错误

跟随《Django for APIs》教程开发博客项目API,访问http://127.0.0.1:8000/api/v1/users/1/时,UserDetail视图抛出以下错误:

AssertionError at /api/v1/users/1/
'UserDetail' should either include a queryset attribute, or override the get_queryset() method.

尽管已在views.py的UserDetail类中定义了相关内容,但问题仍存在,相关代码如下:

相关代码

urls.py

from django.urls import path
from .views import UserList, UserDetail, PostList, PostDetail

urlpatterns = [
    path('users/',UserList.as_view()),
    path('users/<int:pk>/', UserDetail.as_view()),
    path('',PostList.as_view()),
    path('<int:pk>/', PostDetail.as_view()),
]

views.py

from django.contrib.auth import get_user_model
from rest_framework import generics

from .models import Post
from .permissions import IsAuthorOrReadOnly
from .serializers import PostSerializer, UserSerializer

# Create your views here.

class PostList(generics.ListCreateAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

class PostDetail(generics.RetrieveUpdateDestroyAPIView):
    permission_classes = (IsAuthorOrReadOnly,)
    queryset = Post.objects.all()
    serializer_class = PostSerializer

class UserList(generics.ListCreateAPIView):
    queryset = get_user_model().objects.all()
    serializer_class = UserSerializer

class UserDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset_= get_user_model().objects.all()
    serializer_class = UserSerializer

serializers.py

from django.contrib.auth import get_user_model
from rest_framework import serializers
from .models import Post


class PostSerializer(serializers.ModelSerializer):

    class Meta:
        fields = ('id','author','title','body','created_at',)
        model = Post

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = get_user_model()
        fields  = ('id','username',)

models.py

from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class Post(models.Model):
    author = models.ForeignKey(User,on_delete=models.CASCADE)
    title = models.CharField(max_length=50)
    body = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

解决方案

问题根源是UserDetail类中的属性名拼写错误:你将queryset写成了queryset_(多了一个下划线),而Django REST Framework的通用视图要求必须定义queryset属性或重写get_queryset()方法。

修改views.py中的UserDetail类,去掉属性名末尾的下划线:

class UserDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = get_user_model().objects.all()
    serializer_class = UserSerializer

保存代码后重启开发服务器,再次访问http://127.0.0.1:8000/api/v1/users/1/即可正常获取用户详情数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:51:11