一 注冊(cè)DRF
在根setting里面注冊(cè)DRF應(yīng)用,如下是三部分,第一部分是官方的,空一行第二部分是第三方的,再空一行是第三部分自己寫(xiě)的應(yīng)用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework' #DRF 應(yīng)用
'ProjectModule' #注冊(cè)應(yīng)用
]
二 在自己的項(xiàng)目里面編寫(xiě)models;模型格式如下
class Project(models.Model):
"""項(xiàng)目表"""
git_id = ForeignKey(Repositories, on_delete=models.CASCADE, verbose_name='倉(cāng)庫(kù)編號(hào)') #外鍵
branch = models.CharField(max_length=20, verbose_name='分支')
name = models.CharField(max_length=20, verbose_name='項(xiàng)目名稱(chēng)')
user_id = models.CharField(max_length=20, verbose_name='創(chuàng)建人編號(hào)')
update_date = models.DateTimeField(verbose_name='用例同步時(shí)間')
create_date = models.DateTimeField(verbose_name='創(chuàng)建時(shí)間')
class Meta:
db_table = 'Project' #指明數(shù)據(jù)庫(kù)表名
verbose_name = '項(xiàng)目' #在admin站點(diǎn)中顯示的名稱(chēng)
verbose_name_plural = verbose_name #顯示的復(fù)數(shù)名稱(chēng)
def __str__(self):
"""定義每個(gè)數(shù)據(jù)對(duì)象的顯示信息"""
return self.name
新建完models模型后需要執(zhí)行的命令
1 python3 manage.py makemigrations (目的是檢查模型有沒(méi)有變化)
2 python3 manage.py migrate (目的是將變化前移至數(shù)據(jù)表)
三 模型寫(xiě)完之后可以編寫(xiě)序列化器,新建serializers文件(序列化器的作用就是模型轉(zhuǎn)字典,字典轉(zhuǎn)模型)
class ProjectModuleSerializer(serializers.ModelSerializer):
"""定義序列化器"""
class Meta:
model = Project #指定序列化從那個(gè)模型映射字段
fields = '__all__' #映射那些字段,all意思是全部字段
四 編寫(xiě)API views,定義類(lèi)視圖,繼承自ModelViewSet,指定查詢(xún)集,指定序列化器
基于類(lèi)的視圖有四種選擇:
- 使用基礎(chǔ)的APIView類(lèi)(可讀性最高、代碼最多、靈活性最高。當(dāng)你需要對(duì)的API行為進(jìn)行個(gè)性化定制時(shí),建議使用這種方式。)
- 使用Mixins類(lèi)和GenericAPI類(lèi)混配
- 使用通用視圖generics.*類(lèi), 比如generics.ListCreateAPIView(可讀性好、代碼適中、靈活性較高。當(dāng)你需要對(duì)一個(gè)模型進(jìn)行標(biāo)準(zhǔn)的增刪查改全部或部分操作時(shí)建議使用這種方式。)
- 使用視圖集ViewSet和ModelViewSet(可讀性較低、代碼最少、靈活性最低。當(dāng)你需要對(duì)一個(gè)模型進(jìn)行標(biāo)準(zhǔn)的增刪查改的全部操作且不需定制API行為時(shí)建議使用這種方式。)
class ProjectModuleView(ModelViewSet):
"""定義類(lèi)視圖"""
pass
#指定查詢(xún)集
queryset = Project.objects.all()
#指定序列化器
serializer_class = ProjectModuleSerializer
五 配置路由,創(chuàng)建路由器,先在自己項(xiàng)目里面編寫(xiě)urls文件
urlpatterns = [
]
router = DefaultRouter() #創(chuàng)建路由器
router.register(r'', views.ProjectModuleView)#注冊(cè)路由,router.register(路由前綴, 視圖集)
urlpatterns += router.urls #把生成好的路由拼接到urlpatterns里面
六 把子應(yīng)用的urls 注冊(cè)到根urls
七 運(yùn)行Django服務(wù)
python3 manage.py runserver
from django.db import models
# Create your models here.
from django.db.models import ForeignKey
class Repositories(models.Model):
"""代碼倉(cāng)庫(kù)表"""
git_repo = models.CharField(max_length=20, verbose_name='倉(cāng)庫(kù)名')
path = models.CharField(max_length=20, verbose_name='倉(cāng)庫(kù)地址')
class Meta:
db_table = 'Repositories' #指明數(shù)據(jù)庫(kù)表名
verbose_name = '代碼倉(cāng)庫(kù)' #在admin站點(diǎn)中顯示的名稱(chēng)
verbose_name_plural = verbose_name #顯示的復(fù)數(shù)名稱(chēng)
def __str__(self):
"""定義每個(gè)數(shù)據(jù)對(duì)象的顯示信息"""
return self.git_repo
class Platform(models.Model):
"""平臺(tái)表"""
platform = models.CharField(max_length=20, verbose_name='平臺(tái)')
class Meta:
db_table = 'Platform' # 指明數(shù)據(jù)庫(kù)表名
verbose_name = '平臺(tái)表' # 在admin站點(diǎn)中顯示的名稱(chēng)
verbose_name_plural = verbose_name # 顯示的復(fù)數(shù)名稱(chēng)
def __str__(self):
"""定義每個(gè)數(shù)據(jù)對(duì)象的顯示信息"""
return self.platform
class Project(models.Model):
"""項(xiàng)目表"""
git_id = ForeignKey(Repositories, on_delete=models.CASCADE, verbose_name='倉(cāng)庫(kù)編號(hào)') #外鍵
branch = models.CharField(max_length=20, verbose_name='分支')
name = models.CharField(max_length=20, verbose_name='項(xiàng)目名稱(chēng)')
user_id = models.CharField(max_length=20, verbose_name='創(chuàng)建人編號(hào)')
update_date = models.DateTimeField(verbose_name='用例同步時(shí)間')
create_date = models.DateTimeField(verbose_name='創(chuàng)建時(shí)間')
class Meta:
db_table = 'Project' #指明數(shù)據(jù)庫(kù)表名
verbose_name = '項(xiàng)目' #在admin站點(diǎn)中顯示的名稱(chēng)
verbose_name_plural = verbose_name #顯示的復(fù)數(shù)名稱(chēng)
def __str__(self):
"""定義每個(gè)數(shù)據(jù)對(duì)象的顯示信息"""
return self.name
class Case(models.Model):
"""用例表"""
project_id = ForeignKey(Project, on_delete=models.CASCADE, verbose_name='所屬項(xiàng)目編號(hào)')
name = models.CharField(max_length=20, verbose_name='用例名稱(chēng)')#表結(jié)構(gòu)設(shè)計(jì)里面少了這個(gè)
module = models.CharField(max_length=20, verbose_name='導(dǎo)包路徑')
file_path = models.CharField(max_length=20, verbose_name='文件路徑')
delete = models.BooleanField(default=False)
class Meta:
db_table = 'Case' # 指明數(shù)據(jù)庫(kù)表名
def __str__(self):
return self.name
class CaseHash(models.Model):
"""測(cè)試用例記錄表"""
case_id = ForeignKey(Case, on_delete=models.CASCADE, verbose_name='用例編號(hào)')
hash = models.CharField(max_length=20, verbose_name='git文件歷史標(biāo)識(shí)')
name = models.CharField(max_length=20, verbose_name='名稱(chēng)')#這個(gè)地方的name是否要移到Case表里面?
author = models.CharField(max_length=20, verbose_name='作者')
create_date = models.DateTimeField(verbose_name='用例創(chuàng)建時(shí)間')
update_date = models.DateTimeField(verbose_name='用例更新時(shí)間')#這個(gè)地方是不是要加一個(gè)更新時(shí)間?
class Meta:
db_table = 'CaseHash'
def __str__(self):
return self.case_id
class CasePlatform(models.Model):
"""測(cè)試用例支持平臺(tái)表"""
case_hash_id = ForeignKey(CaseHash, on_delete=models.CASCADE, verbose_name='測(cè)試用例記錄編號(hào)')
platform_id = ForeignKey(Platform, on_delete=models.CASCADE, verbose_name='平臺(tái)編號(hào)')
class Meta:
db_table = 'CasePlatform'
def __str__(self):
return self.case_hash_id
class CaseEnv(models.Model):
"""測(cè)試用例支持環(huán)境表"""
case_hash_id = ForeignKey(CaseHash, on_delete=models.CASCADE, verbose_name='測(cè)試用例記錄編號(hào)')
env = models.CharField(max_length=20, verbose_name='環(huán)境')
class Meta:
db_table = 'CaseEnv'
def __str__(self):
return self.case_hash_id