【问题标题】:DRF's not calling post() method when receiving POST requestDRF 在接收 POST 请求时未调用 post() 方法
【发布时间】:2022-06-25 20:15:48
【问题描述】:

我有这样的视图集:

class MyViewSet(CreateAPIView, RetrieveModelMixin, ListModelMixin, GenericViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MySerializer

    def post(self, request, *args, **kwargs):
        import pdb; pdb.set_trace()

class MySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = MyModel
        fields = ['id', 'field1', 'field2'] #only field1 is required in the model

对列表和检索的 GET 请求完美运行。当我发出 POST 请求时,发送 field1 我得到一个状态 201 并且一个新记录被添加到数据库中,所以它也可以工作

但是我的方法MyViewSet.post() 应该覆盖来自generics.CreateAPIView 的相同方法永远不会被调用。

不仅如此,我还尝试在 generics.CreateAPIView.post()CreateModelMixin.create() 函数中添加 pdb.set_trace(),并且在我发出 POST 请求后都没有停止。

所以其他东西正在处理这个 POST 请求并插入数据库,我只是不知道是什么。以及如何覆盖它,以便我可以自定义应该对发布请求执行什么操作?

PS.:另外,我不认为是路由问题,我的urls.py

from rest_framework import routers
from myapp.views import MyViewSet, AnotherViewSet

router = routers.DefaultRouter()
router.register(r'route_one', MyViewSet)
router.register(r'route_two', AnotherViewSet)

【问题讨论】:

    标签: python-3.x django django-rest-framework post-redirect-get


    【解决方案1】:

    我认为您需要使用确切的类才能使用POST api。

    class MyView(CreateModelMixin, ListModelMixin, generics.GenericAPIView):
        queryset = MyModel.objects.all()
        serializer_class = MySerializer
    
        def post(self, request, *args, **kwargs):
            return self.create(request, *args, **kwargs)
    

    在 urls.py 中

    from django.urls import path
    from .views import MyView
    
    urlpatterns = [
        path('route_one', MyView.as_view(), name="my_view_detail")   
    ]
    

    【讨论】:

    • 删除GenericViewSet 并用GenericAPIView 替换它会导致它失败:AttributeError: type object 'MyViewSet' has no attribute 'get_extra_actions'get_extra_actions 好像被路由器调用了。
    • 要使用genericAPIView,在urls.py中你需要使用path而不是router
    • 我会改变我的答案。
    猜你喜欢
    • 2020-04-11
    • 2021-08-28
    • 2018-04-02
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    相关资源
    最近更新 更多