使用DRF实现接口的流程
2022-10-08 本文已影响0人
你猜猜我是谁or宇宙第一帅
一 注册DRF
在根setting里面注册DRF应用,如下是三部分,第一部分是官方的,空一行第二部分是第三方的,再空一行是第三部分自己写的应用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework' #DRF 应用
'ProjectModule' #注册应用
]
二 在自己的项目里面编写models;模型格式如下
class Project(models.Model):
"""项目表"""
git_id = ForeignKey(Repositories, on_delete=models.CASCADE, verbose_name='仓库编号') #外键
branch = models.CharField(max_length=20, verbose_name='分支')
name = models.CharField(max_length=20, verbose_name='项目名称')
user_id = models.CharField(max_length=20, verbose_name='创建人编号')
update_date = models.DateTimeField(verbose_name='用例同步时间')
create_date = models.DateTimeField(verbose_name='创建时间')
class Meta:
db_table = 'Project' #指明数据库表名
verbose_name = '项目' #在admin站点中显示的名称
verbose_name_plural = verbose_name #显示的复数名称
def __str__(self):
"""定义每个数据对象的显示信息"""
return self.name
新建完models模型后需要执行的命令
1 python3 manage.py makemigrations (目的是检查模型有没有变化)
2 python3 manage.py migrate (目的是将变化前移至数据表)
三 模型写完之后可以编写序列化器,新建serializers文件(序列化器的作用就是模型转字典,字典转模型)
class ProjectModuleSerializer(serializers.ModelSerializer):
"""定义序列化器"""
class Meta:
model = Project #指定序列化从那个模型映射字段
fields = '__all__' #映射那些字段,all意思是全部字段
四 编写API views,定义类视图,继承自ModelViewSet,指定查询集,指定序列化器
基于类的视图有四种选择:
- 使用基础的APIView类(可读性最高、代码最多、灵活性最高。当你需要对的API行为进行个性化定制时,建议使用这种方式。)
- 使用Mixins类和GenericAPI类混配
- 使用通用视图generics.*类, 比如generics.ListCreateAPIView(可读性好、代码适中、灵活性较高。当你需要对一个模型进行标准的增删查改全部或部分操作时建议使用这种方式。)
- 使用视图集ViewSet和ModelViewSet(可读性较低、代码最少、灵活性最低。当你需要对一个模型进行标准的增删查改的全部操作且不需定制API行为时建议使用这种方式。)
class ProjectModuleView(ModelViewSet):
"""定义类视图"""
pass
#指定查询集
queryset = Project.objects.all()
#指定序列化器
serializer_class = ProjectModuleSerializer
五 配置路由,创建路由器,先在自己项目里面编写urls文件
urlpatterns = [
]
router = DefaultRouter() #创建路由器
router.register(r'', views.ProjectModuleView)#注册路由,router.register(路由前缀, 视图集)
urlpatterns += router.urls #把生成好的路由拼接到urlpatterns里面
六 把子应用的urls 注册到根urls
七 运行Django服务
python3 manage.py runserver
from django.db import models
# Create your models here.
from django.db.models import ForeignKey
class Repositories(models.Model):
"""代码仓库表"""
git_repo = models.CharField(max_length=20, verbose_name='仓库名')
path = models.CharField(max_length=20, verbose_name='仓库地址')
class Meta:
db_table = 'Repositories' #指明数据库表名
verbose_name = '代码仓库' #在admin站点中显示的名称
verbose_name_plural = verbose_name #显示的复数名称
def __str__(self):
"""定义每个数据对象的显示信息"""
return self.git_repo
class Platform(models.Model):
"""平台表"""
platform = models.CharField(max_length=20, verbose_name='平台')
class Meta:
db_table = 'Platform' # 指明数据库表名
verbose_name = '平台表' # 在admin站点中显示的名称
verbose_name_plural = verbose_name # 显示的复数名称
def __str__(self):
"""定义每个数据对象的显示信息"""
return self.platform
class Project(models.Model):
"""项目表"""
git_id = ForeignKey(Repositories, on_delete=models.CASCADE, verbose_name='仓库编号') #外键
branch = models.CharField(max_length=20, verbose_name='分支')
name = models.CharField(max_length=20, verbose_name='项目名称')
user_id = models.CharField(max_length=20, verbose_name='创建人编号')
update_date = models.DateTimeField(verbose_name='用例同步时间')
create_date = models.DateTimeField(verbose_name='创建时间')
class Meta:
db_table = 'Project' #指明数据库表名
verbose_name = '项目' #在admin站点中显示的名称
verbose_name_plural = verbose_name #显示的复数名称
def __str__(self):
"""定义每个数据对象的显示信息"""
return self.name
class Case(models.Model):
"""用例表"""
project_id = ForeignKey(Project, on_delete=models.CASCADE, verbose_name='所属项目编号')
name = models.CharField(max_length=20, verbose_name='用例名称')#表结构设计里面少了这个
module = models.CharField(max_length=20, verbose_name='导包路径')
file_path = models.CharField(max_length=20, verbose_name='文件路径')
delete = models.BooleanField(default=False)
class Meta:
db_table = 'Case' # 指明数据库表名
def __str__(self):
return self.name
class CaseHash(models.Model):
"""测试用例记录表"""
case_id = ForeignKey(Case, on_delete=models.CASCADE, verbose_name='用例编号')
hash = models.CharField(max_length=20, verbose_name='git文件历史标识')
name = models.CharField(max_length=20, verbose_name='名称')#这个地方的name是否要移到Case表里面?
author = models.CharField(max_length=20, verbose_name='作者')
create_date = models.DateTimeField(verbose_name='用例创建时间')
update_date = models.DateTimeField(verbose_name='用例更新时间')#这个地方是不是要加一个更新时间?
class Meta:
db_table = 'CaseHash'
def __str__(self):
return self.case_id
class CasePlatform(models.Model):
"""测试用例支持平台表"""
case_hash_id = ForeignKey(CaseHash, on_delete=models.CASCADE, verbose_name='测试用例记录编号')
platform_id = ForeignKey(Platform, on_delete=models.CASCADE, verbose_name='平台编号')
class Meta:
db_table = 'CasePlatform'
def __str__(self):
return self.case_hash_id
class CaseEnv(models.Model):
"""测试用例支持环境表"""
case_hash_id = ForeignKey(CaseHash, on_delete=models.CASCADE, verbose_name='测试用例记录编号')
env = models.CharField(max_length=20, verbose_name='环境')
class Meta:
db_table = 'CaseEnv'
def __str__(self):
return self.case_hash_id