# __author: "ZXYang"
# date: 2021/1/2
from rest_framework import serializers
from rest_framework.validators import UniqueValidator
from interfaces.serializers import InterFaces_ModelSerializer
from .models import Projects
def is_contains_projects_word(value):
if '项目' not in value:
raise serializers.ValidationError('项目名称中必须包含“项目”')
class ProjectsSerializer(serializers.Serializer):
"""
定义序列化器,需继承serializer基类或者serializer的子类
定义序列化器的字段,需与模型类中的字段保持一致
定义那些字段,就会返回前端那些字段;若某些字段不想返回给前端,默认不定义;
若定义该字段,该字段就必须输入(除了“read_only=True,只读”......)
write_only=True: 只输入--不输出
allow_blank=True: 可以传空字符串
allow_null=True: 前端可以传空值
default='',
validators=[UniqueValidator(Projects.objects.all())] 字段唯一(如:项目name)
message='项目名不能重复',设置报错信息
"""
id = serializers.IntegerField(label='主键id', help_text='主键id', read_only=True)
# id = serializers.IntegerField(label='主键id', help_text='主键id')
name = serializers.CharField(label='项目名称', help_text='项目名称', min_length=5, max_length=10,
validators=[UniqueValidator(Projects.objects.all(), message='项目名不能重复'),
is_contains_projects_word],
error_messages={'min_length': '项目名称不能少于5位', 'max_length': '项目名称不能多于10位',
'required': '项目名称为必传参数'})
leader = serializers.CharField(label='项目负责人', help_text='项目负责人', min_length=5, max_length=8,
write_only=True)
desc = serializers.CharField(label='项目描述', help_text='项目描述', allow_blank=True, allow_null=True,
default='')
# token = serializers.CharField(read_only=True)
"""
'validate_' + '字段名',只对【name】进行校验
以上name字段校验之后,再执行此校验
必须返回value
"""
def validate_name(self, value):
if not value.endswith('项目'):
raise serializers.ValidationError('项目名号名称必须以“项目”结尾')
return value
"""
validate:
对多个字段进行校验;以上校验通过的值给attrs(一般为字典)
必须返回attrs
"""
def validate(self, attrs):
project_name = attrs.get('name')
leader_name = attrs.get('leader')
if '接口' not in leader_name or len(project_name) <= len(leader_name):
raise serializers.ValidationError('项目负责人名字必须包含“接口”且项目名称字符长度必须大于项目负责人名字')
return attrs
def create(self, validated_data):
project = Projects.objects.create(**validated_data)
return project
def update(self, instance, validated_data):
instance.id = validated_data.get('id')
instance.name = validated_data.get('name')
instance.leader = validated_data.get('leader')
instance.desc = validated_data.get('desc')
instance.save()
# instance.token = 'fafadsfasdfasdfasg2resfasd'
return instance
"""
a. 可以继承ModelSerializer类或ModelSerializer的子类,来创建模型序列化器类
b. 可自动生成序列化器类字段和相关校验
c. 必须在Mata内部类中Model的属性指定,参考的模型类
d. field指定那些模型类中的字段,需自动生成序列化器字段;全部:fields = '__all__'
e. 可自动创建create和update
"""
class Projects_ModelSerializer(serializers.ModelSerializer):
"""
可以创建模型类中没有的字段
创建或者更新数据时,需要重写create/update方法,将模型类中没有的字段移除(例:email)
interfaces:models中【related_name='interfaces', 【指定父获取子表数据的属性名称】】
"""
email = serializers.EmailField(write_only=True)
# interfaces = serializers.PrimaryKeyRelatedField(read_only=True, many=True)
# interfaces = serializers.StringRelatedField(many=True)
"""
父表序列化器:关联子表字段
一对多:若有多个数据,必须加上【many=True】
"""
# interfaces = InterFaces_ModelSerializer(label='所属接口信息', help_text='所属接口信息', read_only=True, many=True)
class Meta:
model = Projects
# fields = '__all__'
"""【fields:若指定某些字段自动生成,那模型类中未指定的字段也必须添加进fields(例:email);__all__除外】"""
# fields = ('name', 'leader', 'desc', 'email', 'interfaces')
fields = ('id', 'name', 'leader', 'desc', 'email')
# 不需要指定模型类的字段
# exclude = ('id', 'desc', 'create_time', 'update_time')
"""【定制】:字段校验"""
extra_kwargs = {
'name': {
# 'write_only': True,
'min_length': 5,
'max_length': 10,
'validators': [UniqueValidator(Projects.objects.all(), message='项目名不能重复'),
# is_contains_projects_word
],
'error_messages': {
'min_length': '项目名称不能少于5位', 'max_length': '项目名称不能多于10位',
'required': '项目名称为必传参数'}
},
'leader': {
# 'write_only': True,
'min_length': 5,
'max_length': 10,
},
'desc': {
'allow_blank': True,
'allow_null': True,
'default': '',
}
}
"""单字段校验"""
# def validate_name(self, value):
# if not value.endswith('项目'):
# raise serializers.ValidationError('项目名号名称必须以“项目”结尾')
# return value
#
"""多字段校验"""
# def validate(self, attrs):
# project_name = attrs.get('name')
# leader_name = attrs.get('leader')
# if '接口' not in leader_name or len(project_name) <= len(leader_name):
# raise serializers.ValidationError('项目负责人名字必须包含“接口”且项目名称字符长度必须大于项目负责人名字')
# return attrs
def create(self, validated_data):
validated_data.pop('email')
# project = Projects.objects.create(**validated_data)
# return project
# 调用父类的create方法,将validated_data传入
return super().create(validated_data)
def update(self, instance, validated_data):
# instance.id = validated_data.get('id')
instance.name = validated_data.get('name')
instance.leader = validated_data.get('leader')
instance.desc = validated_data.get('desc')
instance.save()
return instance
class ProjectsNameSerializer(serializers.ModelSerializer):
class Meta:
model = Projects
fields = ('name', 'id')
class ProjectsInterfacesModelSerializer(serializers.ModelSerializer):
interfaces = InterFacesModelSerializer(label='所属接口信息', help_text='所属接口信息', read_only=True, many=True)
class Meta:
model = Projects
fields = ('interfaces',)