【问题标题】:django rest framework http post method problemsdjango rest框架http post方法问题
【发布时间】:2019-06-22 14:08:07
【问题描述】:

我在 django rest_framework 中创建了一个 api,我正在使用 postman 对其进行测试 GET ,DELETE 方法没有任何问题,但在 PUT ,POST 方法中会出现一些错误。

这是我在 views.py 中的 Book_list 视图:

class Book_list(mixins.ListModelMixin,
                mixins.CreateModelMixin,
                generics.GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = Bookserializer

    def get(self,*args,**kwargs):
        return self.list(self,*args,**kwargs)

    def post(self,*args,**kwargs):
        return self.create(self,*args,**kwargs)

这是我在 views.py 中的 Book_detail 视图:

class Book_detail(mixins.RetrieveModelMixin,
                  mixins.UpdateModelMixin,
                  mixins.DestroyModelMixin,
                  generics.GenericAPIView):

    queryset = Book.objects.all()
    serializer_class = Bookserializer

    def get(self,*args,**kwargs):
        return self.retrieve(self,*args,**kwargs)

    def put(self,*args,**kwargs):
        return self.update(self,*args,**kwargs)

    def delete(self,*args,**kwargs):
        return self.destroy(self,*args,**kwargs)

这是我在 serializers.py 中的Bookserializer

class Bookserializer(serializers.ModelSerializer):
    class Meta():
        model = Book
        fields = ('id','name','publisher',
                  'author','isbn','genere')

这是我的应用程序的urls.py

from django.urls import path , re_path ,register_converter,include
from rest_framework import routers
from . import views

urlpatterns = [

    path('Books' , views.Book_list.as_view() ,
    name = 'Book_L_2'),
    path('Book/<int:pk>' , views.Book_detail.as_view() ,
    name = 'Book_D_2'),
    path('Authors' , views.Author_list.as_view() ,
    name = 'Author_L_2'),
    path('Author/<int:pk>' , views.Author_detail.as_view() ,
    name = 'Author_D_2'),

]

但是当我想要POST 跟随 json (api2/Books url) 和 POSTMAN 时:

{
        "name": "biganeh",
        "publisher": "ghoghnoos",
        "author": 2,
        "isbn": 4,
        "genere": "Horror"
    }

发生了这个错误:

 AttributeError at /api2/Books
'Book_list' object has no attribute 'data'

这意味着request.data 不存在!? 如何解决这个问题?

【问题讨论】:

    标签: django http django-rest-framework http-post postman


    【解决方案1】:

    因为您通过 Book_detail 类中的参数阻止了 POST 和 PUT 方法,所以您只指定了 PUT、DELETE、GET 方法。这也是阻止http请求方法的一种方式。修改代码如下,

    class Book_detail(mixins.RetrieveModelMixin,
                  mixins.UpdateModelMixin,
                  mixins.DestroyModelMixin,
                  mixins.CreateModelMixin,
                  mixins.UpdateModelMixin,
                  generics.GenericAPIView):
    
    queryset = Book.objects.all()
    serializer_class = Bookserializer
    

    任何问题请参考此链接Mixins views

    我的建议是这样指定你可以使用ModelViewset

    【讨论】:

    • 但我不想阻止这 4 个 http 方法!
    • 我在我的问题中编辑了一些错误,并且省略了一些代码;我添加了包含 POST 方法的 book_list 视图类。请再次查看。
    • 当我尝试将 json 放入 localhost/api2/Book/1 或将 json 发布到 localhost/api2/Books 时,它会向我发送我提到的错误!
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 2020-07-26
    • 1970-01-01
    • 2018-11-05
    • 2020-05-30
    相关资源
    最近更新 更多