网站的域名在哪里看,做网站推广送什么,如何申请企业微信,wordpress 加字段这里先写任务应用#xff0c;再写套件#xff0c;然后写接口#xff0c;最后再写请求#xff0c;
这个是新的应用#xff0c;要创建子应用#xff0c;然后添加到settings的注册里面
1、和往常一样先写模型#xff0c;序列化#xff0c;权限#xff0c;视图#xf…这里先写任务应用再写套件然后写接口最后再写请求
这个是新的应用要创建子应用然后添加到settings的注册里面
1、和往常一样先写模型序列化权限视图urls,
1、创建任务模型 from django.db import models
from utils.models import BaseModel
from apps.projects.models import Project,Module,Environment,Interface
class Task(BaseModel): name models.CharField(‘任务名称’, max_length200, help_text‘测试任务名称’) project models.ForeignKey(Project, verbose_name‘所属项目’, on_deletemodels.PROTECT, help_text‘项目id’, related_name‘tasks’) modules models.ManyToManyField(Module, verbose_name‘负责的模块’, help_text‘包含模块’)
def __str__(self):return self.nameclass Meta:db_table tb_taskverbose_name 测试任务verbose_name_plural verbose_nameconstraints [models.UniqueConstraint(fields[name, project],nameunique_task_name)]class TestSuit(BaseModel):
name models.CharField(测试套件名称, max_length200, help_text测试套件名称)
task models.ForeignKey(Task, verbose_name测试任务, on_deletemodels.PROTECT,help_text测试任务id, related_nametest_suits)def __str__(self):return self.nameclass Meta:db_table tb_test_suitverbose_name 测试套件verbose_name_plural verbose_nameconstraints [models.UniqueConstraint(fields[name, task],nameunique_test_suit_name)]记得进行数据迁移 2、写序列化 from rest_framework import serializers
from rest_framework.validators import UniqueTogetherValidator from rest_framework.exceptions import ValidationError
from apps.testcases.models import Task,TestSuit from apps.projects.models import Project
class TaskSerializer(serializers.ModelSerializer):
class Meta:model Taskexclude [is_delete, u_time]validators [UniqueTogetherValidator(querysetmodel.objects.all(),fields[name, project])]def validate_modules(self, value):选择的模型要是当前项目的模型project_id self.initial_data.get(project)queryset Project.objects.filter(pkproject_id)if not queryset:raise ValidationError(id为{}的项目不存在.format(project_id))# module表没有关联projects表需要反向查找用module_set拿到当前项目的模块 values_list ids 是个元组需要脱壳ids queryset.first().module_set.values_list(id)# 列表生成式 元组转化成列表ids [item[0] for item in ids]for m in value:if m.id not in ids:raise ValidationError(id为{}的模块不在当前项目中.format(m.id))return value3、写权限 from utils.permissions import IsSuperUserOrReadOnly from apps.projects.models import Project
class TaskPermission(IsSuperUserOrReadOnly):
def has_create_permission(self, request, view, obj):当前用户是否是当前项目的leaderpk request.data.get(project)queryset Project.objects.filter(pkpk)return queryset and queryset.first().leader request.userdef has_update_delete_permission(self, request, view, obj):当前用户是否是当前项目的leaderreturn obj.project.leader request.user4、写views from django.shortcuts import render from rest_framework.viewsets import ModelViewSet from rest_framework.permissions import IsAuthenticated
from testcases.serializers import TaskSerializer from utils.pagintion import TenItemPerPagePagination from testcases.permissions import TaskPermission from apps.testcases.models import Task
class TaskViewSet(ModelViewSet): serializer_class TaskSerializer queryset Task.objects.all().order_by(‘-c_time’) # queryset models.Task.objects.all() permission_classes [IsAuthenticated, TaskPermission] pagination_class TenItemPerPagePagination # filterset_field [‘project’] # 和下面一样 filterset_field (‘project’,)
def perform_create(self, serializer):self.check_object_permissions(self.request, None)super().perform_create(serializer)5、配置url from . import views
route DefaultRouter() route.register(‘tasks’, views.TaskViewSet) urlpatterns route.urls
6、调试