先列出projects的model定义规则
class Projects(models.Model):
"创建projects模型类"
#unique=True 设置唯一键
#verbose_name 字段人性化显示
#help_text api文档的中文显示
name = models.CharField(verbose_name="项目名称",max_length=30,unique=True,help_text="项目名称")
leader = models.CharField(verbose_name='负责人', max_length=50, help_text='负责人')
tester = models.CharField(verbose_name='测试人员', max_length=50, help_text='测试人员')
programer = models.CharField(verbose_name='开发人员', max_length=50, help_text='开发人员')
publish_app = models.CharField(verbose_name='发布应用', max_length=100, help_text='发布应用')
# 11. null设置数据库中此字段允许为空, blank用于设置前端可以不传递, default设置默认值
#12.长文本不能用charfield 要用TextField
desc = models.TextField(verbose_name='简要描述', help_text='简要描述', blank=True, default='', null=True)
desc2 = models.TextField(verbose_name='简要描述', help_text='简要描述', blank=True, default='', null=True)
#models.IntegerField(choices=[])可以限定该字段值的选择范围
# 定义子类Meta, 用于设置当前数据模型的元数据信息
class Meta:
db_table = 'tb_projects' #给数据库更换表名(默认是app名projects_model名小写,即 projects_projects)
# 会在admin站点中, 显示一个更人性化的表名
verbose_name = '项目'
verbose_name_plural = '项目'#复数形式
def __str__(self):
return self.name
ModelSerializer自动创建Projects序列化器
from rest_framework import serializers
from projects.models import Projects
class ProjectModelSerializer(serializers.ModelSerializer):
class Meta:
model = Projects
fields = "__all__"
我们打印下 我们创建的序列化器
python manage.py -i ipython
接下来我们还有一些对字段的自定义校验等等;
from rest_framework import serializers
from rest_framework.validators import UniqueValidator
from projects.models import Projects
def is_unique_project_name(name):
if '项目' not in name:
raise serializers.ValidationError('项目名称中必须包含"项目"')
class ProjectModelSerializer(serializers.ModelSerializer):
#要想自定义 就重新自己写一个,把自动生成的覆盖掉
name = serializers.CharField(label='项目名称', max_length=200,
help_text='项目名称', write_only=True,
validators=[UniqueValidator(queryset=Projects.objects.all(), message='项目名已存在'),
is_unique_project_name],
error_messages="")
class Meta:
model = Projects
# all 把所有的字段拿來做自動创建序列化器
#fields = "__all__"
#自定义指定字段来创建序列化器
#python manage.py shell -i ipython
fields = ('id','name','leader','tester','programer')
#反选
#exclude = ()
#指定不校验的字段(只进行输出,不输入校验)
#read_only_fields = ("leader")
# 7. 使用extra_kwargs参数, 可以修改未显式声明的字段的属性
# key为校验的选项名, value为自定义错误提示字符串
#也可以在这里重新制定序列化器的字段校验,和最上面重新制定name字段校验的是一样的
extra_kwargs = {
'leader': {
'write_only': True,
'error_messages': {'max_length': '最大长度不超过50个字节'}
},
# 可以为序列化器字段, 添加或者修改属性
'name': {
'write_only': True,
'validators': [UniqueValidator(queryset=Projects.objects.all(), message='项目名不能重复'),
is_unique_project_name],
'label': '项目名称'
}
}
自动创建序列化器的同时 会自动创建
def create() 和 def update() 方法,直接调用就可以了
models.CharField(verbose_name=‘测试人员’, max_length=50, help_text=‘测试人员’)
默认trim_whitespace=True 就把前后的空格给去掉了