django rest api __init__() 需要 1 个位置参数,但给出了 2 个

问题描述

api 链接无效。显示错误init() 需要 1 个位置参数,但给出了 2 个”

请帮帮我。我是 Django 的初学者

尝试创建博客api 模型.py:

class Blog(models.Model):
    blog_id = models.AutoField(primary_key=True,editable=False)
    title = models.CharField(max_length=100,null=False)
    description = models.TextField(null=False)
    image = models.ImageField(null=True,blank=True)
    user = models.ForeignKey(User,on_delete=models.SET_NULL,null=True)
    created_at = models.DateTimeField(auto_Now_add=True)
    updated_at = models.DateTimeField(auto_Now=True)

    def __str__(self):
        return self.title

view.py

class BlogViewSet(viewsets.ModelViewSet):
    serializer_class = BlogSerializer
    permission_classes = IsAuthenticated
    queryset = Blog.objects.all()

    def perform_create(self,serializer):
        serializer.save(user=self.request.user)

serializer.py:

class BlogSerializer(serializers.ModelSerializer):
    user = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = Blog
        fields = '__all__'

urls.py

from django.urls import path
from rest_framework.routers import DefaultRouter

from . import views
from rest_framework_simplejwt.views import (
    TokenObtainPairView,)

router = DefaultRouter()
router.register('blogs',views.BlogViewSet,basename='blogs')

urlpatterns = [
    path('users/login',views.MyTokenObtainPairView.as_view()),path('users/register',views.register_user,name='register'),path('users/profile',views.get_user_profile,name='profile'),path('blogs/',name='blogs'),path('avatar/',views.get_avatar,name='avatar'),]

因此,当我对“http://localhost:8000/api/blogs/”执行获取请求时,它会显示错误

TypeError at /api/blogs/

__init__() takes 1 positional argument but 2 were given

Request Method:     GET
Request URL:    http://localhost:8000/api/blogs/
Django Version:     3.2.4
Exception Type:     TypeError
Exception Value:    

__init__() takes 1 positional argument but 2 were given

Exception Location:     D:\work environment\Django_Api\codersavvy\lib\site-packages\django\core\handlers\base.py,line 181,in _get_response
Python Executable:  D:\work environment\Django_Api\codersavvy\Scripts\python.exe
Python Version:     3.9.2
Python Path:    

['D:\\work environment\\Django_Api\\codersavvy','C:\\Users\\S\\AppData\\Local\\Programs\\Python\\python39\\python39.zip','C:\\Users\\S\\AppData\\Local\\Programs\\Python\\python39\\DLLs','C:\\Users\\S\\AppData\\Local\\Programs\\Python\\python39\\lib','C:\\Users\\S\\AppData\\Local\\Programs\\Python\\python39','D:\\work environment\\Django_Api\\codersavvy','D:\\work environment\\Django_Api\\codersavvy\\lib\\site-packages']

Server time:    Mon,14 Jun 2021 17:28:12 +0000

解决方法

您需要调用 .as_view() 将(基于类的)ViewSet 转换为一个将分派 HTTP 调用的函数:

path('blogs/',views.BlogViewSet.as_view(),name='blogs'),

由于您创建了 ViewSet,因此您可以将 router [drf-doc] 用于:

from django.urls import path
from rest_framework.routers import DefaultRouter

from . import views
from rest_framework_simplejwt.views import (
    TokenObtainPairView,)

router = DefaultRouter()
router.register('blogs',views.BlogViewSet,basename='blogs')

urlpatterns = [
    path('users/login',views.MyTokenObtainPairView.as_view()),path('users/register',views.register_user,name='register'),path('users/profile',views.get_user_profile,name='profile'),path('avatar/',views.get_avatar,name='avatar'),]

urlpatterns += router.urls