python - Django Rest Framework 创建仅用于执行的 REST API

标签 python django python-3.x django-rest-framework

我正在开发一个 django 项目,其中我需要为某些执行构建一个 REST API,我对模型没有太多担忧,因为我只需要根据用户的输入/调用执行执行。

这是我的场景:

  1. 主要的是部署(我项目中的一个应用程序)

  2. 在获取请求时,用户将获得所有内容的列表 部署(对象)。

  3. 用户将向 /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 ModelSerializerModelViewSet这样您就可以轻松地重用已有的 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 ——这只是展示了如何做到这一点。

ModelViewSetModelSerializer 删除了大部分样板代码。但是,如果您以前没有使用过 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/

相关文章:

python - Pandas - 根据列列表中的值选择行

python - 抛出 ZeroDivisionError

python - 如何找到一个系列中多个组的总和?

linux - 需要协助将 python2.7 设置为默认值并安装 Django

javascript - 编剧自动滚动到无限滚动页面底部

创建集合的 Python 性能比较 - set() 与 {} 文字

python - 检查脚本事件的代码 (python)

python - 获取日期大于今天或空日期的对象

Python:并非所有参数都在字符串格式化期间转换

python - GIS/Gdal/OSGeos 在 Windows 上的 django 中导入错误