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
。