Python DRF在不写入模型的情况下发布到视图集

Python DRF在不写入模型的情况下发布到视图集,python,django,rest,django-rest-framework,django-rest-viewsets,Python,Django,Rest,Django Rest Framework,Django Rest Viewsets,我总是在通过Django Rest框架端点发布时将数据写入数据库。这一次,我想处理接收到的数据并将其发送到其他地方,而无需写入数据库。我从ModelViewSet切换到ViewSet,我可以发出GET请求OK,但通过DRF URL卷曲或发布时收到错误请求400。这是一个有效的最小代码(不需要身份验证等): url.py 序列化程序.py views.py 非常感谢您的建议。您可以将GenericAPIView用于get或post请求,并在验证方法中执行一些逻辑操作,例如使用信号执行某

我总是在通过Django Rest框架端点发布时将数据写入数据库。这一次,我想处理接收到的数据并将其发送到其他地方,而无需写入数据库。我从
ModelViewSet
切换到
ViewSet
,我可以发出GET请求OK,但通过DRF URL卷曲或发布时收到错误请求400。这是一个有效的最小代码(不需要身份验证等):

  • url.py
  • 序列化程序.py
  • views.py

非常感谢您的建议。

您可以将GenericAPIView用于get或post请求,并在验证方法中执行一些逻辑操作,例如使用信号执行某些操作或编辑某些操作。此外,您还可以对任何ModelViewSet使用@detailt_route或@list_route来编写特殊url,例如,用于编辑额外数据

我很少这样做:

在URL.py中

urlpatterns = [
    url('v1/message', ContactAPIView.as_view(), name='message'),
]
in view.py

class ContactAPIView(GenericAPIView):
    serializer_class = ContactSerializer
    permission_classes = ()

    def post(self, request, *args, **kwargs):
        serializer_class = self.get_serializer_class()
        serializer = serializer_class(data=request.data, context={'request': request})
        serializer.is_valid(raise_exception=True)
        data = {"status": True}

        return Response(data)
在serializers.py中

class ContactSerializer(serializers.Serializer):
    text = serializers.TextField()

    def validate(self, attrs):
        write some logic


出现此错误是因为您正在使用ViewSet,它使用DefaultRouter为您注册路由器。它的作用是为您的视图集创建两个URL

  • 消息
  • 消息/id
  • 那么在你目前的情况下,;i、 e.viewset您需要在url中发送一些虚拟号码才能访问此post函数(这不是一个好方法)

    因此,您应该使用父级不包含
    ViewSetMixin
    (提供
    路由器注册功能的)的任何类,就像您从这些类继承视图一样

    • ListModelMixin
    • CreateModelMixin
    • 一般观点

    谢谢,这对URL.py中
    路由器的设置有何影响?您需要手动注册路由器,如
    urlpatterns=[path('message',APIView.as_view(),name='message'),]
    这解决了这个问题,非常感谢,在控制台输出后应用了一些小的修改。用例很简单,因此GenericAPIView就足够了。
    urlpatterns = [
        url('v1/message', ContactAPIView.as_view(), name='message'),
    ]
    
    class ContactAPIView(GenericAPIView):
        serializer_class = ContactSerializer
        permission_classes = ()
    
        def post(self, request, *args, **kwargs):
            serializer_class = self.get_serializer_class()
            serializer = serializer_class(data=request.data, context={'request': request})
            serializer.is_valid(raise_exception=True)
            data = {"status": True}
    
            return Response(data)
    
    class ContactSerializer(serializers.Serializer):
        text = serializers.TextField()
    
        def validate(self, attrs):
            write some logic