DRF使用ModelViewSet增删改查

A、models.py 

class TestScene(models.Model):
test_scene_id = models.AutoField('测试场景id', primary_key=True)
test_scene_name = models.CharField('测试场景名字', unique=True, max_length=300)
case_group = models.ManyToManyField(to="CaseGroup")

class Meta:
verbose_name = '测试场景'
verbose_name_plural = verbose_name

def __str__(self):
return self.test_scene_name

B、VIEWSET

from rest_framework import serializers
from XXX.models import *

class TestSceneSerializer(serializers.ModelSerializer):
class Meta:
model = TestScene
fields = '__all__'

C、VIEWSET实现的view

 

from rest_framework import viewsets

class SceneInfoViewSet(viewsets.ModelViewSet):
      queryset = TestScene.objects.all()
      serializer_class = TestSceneSerializer

 

D、路由配置
主url
urlpatterns = [
  path(r"", include("zatester.urls")),
  path('admin/', admin.site.urls),
  path("api/docs/", include_docs_urls()),
]
app url


router = routers.SimpleRouter()
router.register(r"scenes", scene.SceneInfoViewSet, basename="devices")

urlpatterns = [
path(r"api/", include(router.urls)),
]

 

启动服务,采用get、post、put、update、partial_update 等访问以下接口,可以对model类进行操作

http://127.0.0.1:9000/api/scenes/ 

 

具体接口定义访问http://localhost:9000/api/docs

 

 

 

D、VIEWSET自定义action

额外的action

 viewset通过以上来实现列表,详情,增加,修改,部分修改,删除种不同功能的接口。可是在实际情况中,我们需要的不仅仅是这些,所以,我们需要额外的url来路由。于是引入了action装饰器,我们可以在viewset中添加额外的路由了,使用方法:

from myapp.permissions import IsAdminOrIsSelf
from rest_framework.decorators import action

class UserViewSet(ModelViewSet):
    ...

    @action(methods=['post'], detail=True, permission_classes=[IsAdminOrIsSelf])
    def set_password(self, request, pk=None):
Note
在之前旧的版本使用的是detail_route,list_route连个装饰器来添加额外的路由,用来区别url中是否有pk字段。action装饰器则是通过detail字段来区别

使用上面action生成的url是 ^users/{pk}/set_password/$。 如果不想使用方法的名字来做路由,可以在action中指定url_name

 

posted @ 2020-11-26 16:32  yoyo008  阅读(2983)  评论(0编辑  收藏  举报