Python DRF在不写入模型的情况下发布到视图集
我总是在通过Django Rest框架端点发布时将数据写入数据库。这一次,我想处理接收到的数据并将其发送到其他地方,而无需写入数据库。我从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请求,并在验证方法中执行一些逻辑操作,例如使用信号执行某
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
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