1. 新建一个子项目interfaces
models.py
from django.db import models
from utils.base_models import baseModel
class Interfaces(baseModel):
id = models.AutoField(verbose_name='id主键', primary_key=True, help_text='id主键')
name = models.CharField('接口名称', max_length=200, unique=True, help_text='接口名称')
# 加了related_name='interfaces'父表调用丛表用这个名字,没有定义则用app加__set名字
project = models.ForeignKey('projects.Projects', on_delete=models.CASCADE,
related_name='interfaces', help_text='所属项目')
tester = models.CharField('测试人员', max_length=50, help_text='测试人员')
desc = models.CharField('简要描述', max_length=200, null=True, blank=True, help_text='简要描述')
class meta:
db_table = 'tb_interfaces'
verbose_name = '接口信息'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
serializers.py
#!/usr/bin/env python
# encoding: utf-8
"""
@author: 拾壹
@software: PyCharm
@file: serializers.py.py
@time: 2021/10/3 15:54
"""
from rest_framework import serializers
from .models import Interfaces
from projects.models import Projects
class ProjectModelSerializer(serializers.ModelSerializer):
class meta:
model = Projects
fields = '__all__'
class InterfaceModelSerializer(serializers.ModelSerializer):
# a.会自动将外键字段生成PrimaryKeyRelatedField类型,返回的是外键表对应的ID值
# project = serializers.PrimaryKeyRelatedField(help_text='所属项目', queryset=Projects.objects.all())
# b.会自动调用外键表的__str__方法,输出名字
# project = serializers.StringRelatedField(label="所属项目")
# c.使用父表的模型序列化器来创建
project = ProjectModelSerializer(read_only=True)
class meta:
model = Interfaces
fields = '__all__'
2.在project目录下修改serializers.py文件
#!/usr/bin/env python
# encoding: utf-8
"""
@author: 拾壹
@software: PyCharm
@file: serializers.py
@time: 2021/10/2 20:40
"""
from rest_framework import serializers
from rest_framework.validators import Uniquevalidator
from .models import Projects
def is_unique_project_name(value):
"""创建自定义校验器
:param value:
:return:
"""
qs = Projects.objects.filter(name=value)
if qs:
raise serializers.ValidationError("项目名不能重复")
def cotain_keyword_project_name(value):
"""
创建自定义序列化器,校验项目与名称是否包含“项目”
:param value:
:return:
"""
if "项目" not in value:
raise serializers.ValidationError("项目名称中不包含‘项目’!")
class ProjectModelSerializer(serializers.ModelSerializer):
# 定义meta内部类,用于设置当前序列化器类的元数据信息
# name = serializers.CharField(label='项目名称', max_length=200, help_text='项目名称',
# validators=[is_unique_project_name, cotain_keyword_project_name])
# email = serializers.EmailField(label='邮箱', allow_blank=True, allow_null=True, default='732114573@qq.com')
# 默认情况下,父表模型序列化器类不会创建子表字段,需要显示创建
# 子表字段名为:子表类名小写_set
# 子表定义外键字段时,指定了related_name='interfaces',那么这里需要使用related_name所指定值
# interfaces_set = serializers.StringRelatedField(many=True)
interfaces = serializers.StringRelatedField(many=True)
class meta:
# 1.指定参照哪一个模型
model = Projects
# 指定为模型类的哪些字段来生成序列化器字段,__all__是全部
# 会自动添加主键read_only=True
# fields = '__all__'
# fileds元祖里指定的是所有的序列化字段(模型类中不包含的字段,也需要在fields中)
# fields = ('id', 'name', 'leader', 'tester', 'email')
# fields = ('id', 'name', 'leader', 'tester', 'interfaces_set')
fields = ('id', 'name', 'leader', 'tester', 'interfaces')
# 指定read_only为True的字段
read_only_fields = ('desc', '')
# 也可以在此处定义,就可以注释上边的自定义的name
extra_kwargs = {
'name': {
'error_messages': {"max_length": "负责人名称的长度不能超过50个字符",
"min_length": "负责人名称的长度不能少于10个字符"},
'read_only': True,
'min_length': 50,
'validators': [is_unique_project_name, cotain_keyword_project_name]
},
}
def validate_name(self, value):
"""
校验项目名是否以“项目”结尾
:param value:
:return:
"""
if not value.endswith('项目'):
raise serializers.ValidationError('项目名称必须以’项目结尾')
return value
def validate(self, attrs):
"""多字段校验
:param attrs:
:return:
"""
name = attrs['name']
leader = attrs['leader']
if '啊哈' not in name and '啊哈' not in leader:
raise serializers.ValidationError('啊哈必须是项目或者负责人其中一个')
return attrs
def create(self, validated_data):
"""
创建项目
:param validated_data: 校验通过之后的项目数据
:return: 返回项目创建成功后的模型类
"""
# 1.前端非要传email,然后数据不需要存,这个时候pop去掉,然后再调用父类
validated_data.pop('email')
super().create(validated_data)
def update(self, instance, validated_data):
"""
更新项目
:param instance: 待更新的项目模型类对象
:param validated_data: 校验通过之后的项目数据
:return: 项目更新成功之后的模型类对象
"""
instance.name = validated_data['name']
instance.leader = validated_data['leader']
instance.tester = validated_data['tester']
instance.programmer = validated_data['programmer']
instance.publish_app = validated_data['publish_app ']
instance.desc = validated_data['desc']
instance.save()
return instance
3. 请求接口
http://127.0.0.1:8000/projects/1/



