DRF Post 到 ViewSet 而不写入模型

DRF Post to ViewSet without writing into Model

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

from django.urls import path, include
from .views import ContactView
from rest_framework import routers

router = routers.DefaultRouter()
router.register('message', ContactView, basename='message')

urlpatterns = [
    path('', include(router.urls)),
]
from rest_framework import serializers

class ContactSerializer(serializers.Serializer):
    text = serializers.CharField(max_length=250)
from rest_framework.response import Response
from .serializers import ContactSerializer
from rest_framework import viewsets

class ContactView(viewsets.ViewSet):
    def list(self, request):
        return Response('Got it')

    def create(self, request):
        serializer = ContactSerializer(data=request.data)
        if serializer.is_valid():
            return Response(serializer.data)
        else:
            return Response('Invalid')

非常感谢您的建议。

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

我很少这样做:

在urls.py

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

在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

您收到此错误是因为您正在使用使用 DefaultRouter 为您注册路由器的视图集。它的作用是为您的视图集创建 2 urls

  1. message
  2. message/id

所以在你目前的情况下;即视图集,您需要在 url 中发送一些虚拟数字才能访问此 post 函数(这不是一个好方法)。

因此,您应该使用父级不包含 ViewSetMixin 的任何 class(它提供 Router Registration 的功能),就像在您的情况下从这些 [=34 继承您的视图=]es

  • ListModelMixin
  • CreateModelMixin
  • GenericAPIView