【问题标题】:Django Rest Framework Create REST API only for executionsDjango Rest Framework 仅为执行创建 REST API
【发布时间】:2018-06-27 11:37:58
【问题描述】:

我正在开发一个 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 的文档感到困惑,尤其是关于序列化程序的文档。

更新:目前,我正在尝试如何进行 POST: 来自 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)

那么,如何验证传入的数据/请求?

这是我的部署模型:

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)

来自 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 功能并且 DRF 实际上会妨碍您,您为什么要使用 DRF?你不需要它来用 Django 构建一个 REST api,你可以手动完成(它最终只是请求和响应)或者使用一些更轻的库,比如 toastdriven 的restless
  • 嗨 @brunodesthuilliers,我需要 drf 提供的其他内容,例如权限、身份验证等。
  • 嗨@MuhammadFahadManzoor,要实现我自己的get和posts,比如django视图,我应该使用API​​View吗?

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


【解决方案1】:

您可能希望实现 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 表单一样。

视图集可能是这样的(例如在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 中注册视图集:

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

【讨论】:

  • 嗨@mar​​tyn!那么,当 post 请求到来时 create 会调用吗?
  • 现在它返回另一个错误:raise TypeError("The actions argument must be provided when " TypeError: The actions argument must be provided when call .as_view() on a ViewSet . 例如.as_view({'get': 'list'})
  • 是的,create 应该是链接到 post call 的方法。我没有在我的帖子中提到这一点,但您还需要将路由器(例如 DefaultRouter )添加到您的 urls.py,类似于您为 Django 应用程序执行此操作的方式
  • 现在,它返回AttributeError: 'str' object has no attribute 'values'
  • 我没有进行任何单元测试,甚至在我的url 中添加了{'post': 'create'},但仍然会发生此错误。
猜你喜欢
  • 2015-08-02
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 2019-05-20
  • 2016-12-23
  • 2014-02-14
相关资源
最近更新 更多