DRF Post 到 ViewSet 而不写入模型
DRF Post to ViewSet without writing into Model
在通过 Django Rest Framework 端点发布时,我总是将数据写入数据库。这次我想处理接收到的数据并将其发送到其他地方 而无需 写入数据库。我从 ModelViewSet
切换到 ViewSet
,我可以发出 GET 请求,但是当我通过 DRF [=46] 卷曲或 POST 时收到 错误请求 400 =].这是一个有效的最小代码(删除了对身份验证等的需要):
- urls.py
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)),
]
- serializers.py
from rest_framework import serializers
class ContactSerializer(serializers.Serializer):
text = serializers.CharField(max_length=250)
- views.py
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
message
message/id
所以在你目前的情况下;即视图集,您需要在 url 中发送一些虚拟数字才能访问此 post 函数(这不是一个好方法)。
因此,您应该使用父级不包含 ViewSetMixin
的任何 class(它提供 Router Registration
的功能),就像在您的情况下从这些 [=34 继承您的视图=]es
- ListModelMixin
- CreateModelMixin
- GenericAPIView
在通过 Django Rest Framework 端点发布时,我总是将数据写入数据库。这次我想处理接收到的数据并将其发送到其他地方 而无需 写入数据库。我从 ModelViewSet
切换到 ViewSet
,我可以发出 GET 请求,但是当我通过 DRF [=46] 卷曲或 POST 时收到 错误请求 400 =].这是一个有效的最小代码(删除了对身份验证等的需要):
- urls.py
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)),
]
- serializers.py
from rest_framework import serializers
class ContactSerializer(serializers.Serializer):
text = serializers.CharField(max_length=250)
- views.py
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
message
message/id
所以在你目前的情况下;即视图集,您需要在 url 中发送一些虚拟数字才能访问此 post 函数(这不是一个好方法)。
因此,您应该使用父级不包含 ViewSetMixin
的任何 class(它提供 Router Registration
的功能),就像在您的情况下从这些 [=34 继承您的视图=]es
- ListModelMixin
- CreateModelMixin
- GenericAPIView