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
。