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 aquerysetattribute, or override theget_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
相关产品推荐
相关产品推荐

