我正在开发一个 django 项目,其中我需要为某些执行构建一个 REST API,我对模型没有太多担忧,因为我只需要根据用户的输入/调用执行执行。
这是我的场景:
主要的是部署(我项目中的一个应用程序)
在获取请求时,用户将获得所有内容的列表 部署(对象)。
用户将向 /deployments 发送 POST 请求以及完整的 对象为:
{ "deployment_name": "dep4", "credentials": "cre4", "project_name": "pro4", "project_id": "004", "cluster_name": "clus4", "zone_region": "zon4", "services": "Single", "configuration": "conf4", "routing": "route4" }
然后我需要使用这些数据,验证并根据这些数据执行一些执行。例如,我会借助这些信息,使用第三方API在云平台上进行部署。
我对 DRF 的文档感到非常困惑,尤其是关于序列化器的文档。
Update: Currently, How I'm trying to do the POST: From apiview.py
class DeploymentsList(APIView):
queryset = DeploymentOnUserModel.objects.all()
def post(self, request):
print(request.data)
DeploymentOnUserModel.objects.create(
deployment_name=request.data['deployment_name'],
credentials=request.data['credentials'],
project_name=request.data['project_name'],
project_id=request.data['project_id'],
cluster_name=request.data['cluster_name'],
zone_region=request.data['zone_region'],
services=request.data['services'],
configuration=request.data['configuration'],
routing=request.data['routing'],
)
return Response(request.data)
So, how can I validate the incoming data/request?
这是我的部署模型:
class DeploymentOnUserModel(models.Model):
deployment_name = models.CharField(max_length=256, )
credentials = models.TextField(blank=False)
project_name = models.CharField(max_length=150, blank=False)
project_id = models.CharField(max_length=150, blank=True)
cluster_name = models.CharField(max_length=256, blank=False)
zone_region = models.CharField(max_length=150, blank=False)
services = models.CharField(max_length=150, choices=services)
configuration = models.TextField()
routing = models.TextField()
def save(self, **kwargs):
if not self.id and self.services == 'Multiple' and not self.routing and not self.configuration:
raise ValidationError("You must have to provide routing for multiple services deployment.")
super().save(**kwargs)
From urls.py:
app_name = 'deployments'
urlpatterns = [
path('deployments/', apiview.DeploymentsList.as_view(), name='deployment_list'),
path('deployments/<int:pk>', apiview.DeploymentDetail.as_view(), name='deployment_detail')
]
我应该使用 DRF 中的哪种方法和内容来实现我的 API。
最佳答案
您可能想要实现 DRF ModelSerializer和 ModelViewSet这样您就可以轻松地重用已有的 Django 模型。
你的序列化器可能是这样的(例如在serializers.py
中):
from rest_framework import serializers
from .models import DeploymentOnUser
class DeploymentOnUserModelSerializer(serializers.ModelSerializer):
class Meta:
model = DeploymentOnUser
fields = (deployment_name, credentials, )
您应该在此处添加自己的验证,就像使用 Django 表单一样。
View 集可能是这样的(例如在views.py
中):
from rest_framework import viewsets
from rest_framework.response import Response
from .models import DeploymentOnUserModel
from .serializers import DeploymentOnUserModelSerializer
class DeploymentOnUserViewSet(viewsets.ModelViewSet):
queryset = DeploymentOnUserModel.objects.all()
serializer_class = DeploymentOnUserModelSerializer
def create(self, request, *args, **kwargs):
"""overwrite this for extra actions"""
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data)
根据您的情况,您甚至可能需要覆盖 create
——这只是展示了如何做到这一点。
ModelViewSet
和 ModelSerializer
删除了大部分样板代码。但是,如果您以前没有使用过 DRF,那么首先查看 tutorial 也没什么坏处。
不要忘记在 urls.py
中注册 View 集:
from django.conf.urls import url, include
from rest_framework import routers
from .views import DeploymentOnUserViewSet
router = routers.DefaultRouter()
router.register('deployments', DeploymentOnUserViewSet)
urlpatterns = [
# other patterns also go here
url('', include(router.urls)),
]
然后您可以通过执行以下操作来测试您的 API:对 /deployments/
进行 POST 调用。
对于单元测试,我主要使用这种模式:
from rest_framework.test import APIRequestFactory
# Create a POST request, at the root
request = APIRequestFactory().post('/')
response = DeploymentOnUserViewSet.as_view({'post': 'create'})(request)
assert response.status_code == 200
关于python - Django Rest Framework 创建仅用于执行的 REST API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51061850/