1.DRF视图
-
Django REST framework建立在Web应用开发框架,快速开发REST API接口应用
-
提供序列化器,帮助实现序列化与反序列化
-
提供类视图、扩展类、视图集来简化视图编写工作
-
提供过滤、分页等功能
-
提供API的Web可视化界面,测试接口
API协议
- 尽量使用https协议,比较安全
- 域名中尽量出现api字样
- 路径尽量出现版本号 如: /v1/users/users/
- 路径中尽量使用名词
- 使用请求方法 来表示对资源的操作
- 路径中拼接查询字符串,实现数据过滤、分页、排序等
2.创建Django
django-admin startproject 项目名
2.1 配置settings
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # drf框架
'corsheaders',
'user'
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'corsheaders.middleware.CorsMiddleware'
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST':'localhost',
'PORT':3306,
'USER':'root',
'PASSWORD':'123123',
'NAME':'p6',
}
}
CORS_ORIGIN_WHITELIST = [
"http://localhost:8080",
]
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOW_HEADERS = ("*")
CORS_ALLOW_METHODS = ("*")
2.2 创建模型类
模型需要添加时间和更新时间,为了简便
创建父类 ----> 创建其他模型继承自这个父类
from django.db import models
# Create your models here.
class BaseModel(models.Model):
created_time = models.DateTimeField(auto_now_add=True)
update_time = models.DateTimeField(auto_now=True)
# 部门表
class Department(BaseModel):
name = models.CharField("部门名称",max_length=30)
def __str__(self):
return self.name
class Meta:
db_table = "department"
# 职务表
class Duty(BaseModel):
name = models.CharField("职务名称",max_length=30)
def __str__(self):
return self.name
class Meta:
db_table = "duty"
# 员工表
class Staff(models.Model):
SEX_CHOICE = (
(1,'男'),
(2,'女')
)
name = models.CharField("姓名",max_length=30)
sex = models.IntegerField("性别",choices=SEX_CHOICE,default=1)
phone = models.CharField("手机号",max_length=11)
email = models.EmailField("邮箱",max_length=60)
department = models.ForeignKey(Department,on_delete=models.CASCADE,verbose_name='部门')
duty = models.ForeignKey(Duty,on_delete=models.CASCADE,verbose_name='职责')
def __str__(self):
return self.name
class Meta:
db_table = 'staff'
User这个模型类继承django封装的AbstractUser,
上面没有手机号,上次登录时间,所以自己定义
# User模型类
from django.contrib.auth.models import AbstractUser
from django.utils import timezone
class User(AbstractUser):
mobile = models.CharField("手机号",max_length=11)
last_login = models.DateTimeField("上次登录",default=timezone.now)
def __str__(self):
return self.username
class Meta:
db_table = "user"
注:这个模型类必须是第一次迁移,否则会报错
3.序列化器
3.1序列化定义:
将模型类对象转为字典,然后经过Response转为json字符串-----序列化
3.2反序列化
将前端的json字符串经过Request对象,转为字典或类字典,然后经过序列化器转为模型类的对象-----反序列化
3.3 Serializer
from rest_framework import serializers
from .models import *
# 部门的序列化器
class DepartmentSerializer(serializers.Serializer):
id = serializers.IntegerField(label="ID",read_only=True)
# allow_null 是否为空 allow_blank 允许为空 trim_whitespace 截断两边空格
name = serializers.CharField(label="部门名称",min_length=2,max_length=10,allow_null=True,
allow_blank=True,trim_whitespace=True)
class DutySerializer(serializers.Serializer):
id = serializers.IntegerField(label="ID", read_only=True)
name = serializers.CharField(label="职务名称", min_length=2, max_length=10, allow_null=True,
allow_blank=True, trim_whitespace=True)
# 员工
class StaffSerializer(serializers.Serializer):
id = serializers.IntegerField(label="ID",read_only=True)
name = serializers.CharField(label="员工姓名",min_length=2,max_length=10,allow_null=True,
allow_blank=True,trim_whitespace=True)
sex = serializers.IntegerField(label="性别",default=1)
phone = serializers.CharField(label='手机号',min_length=11,max_length=11,allow_null=True,allow_blank=True,
trim_whitespace=True)
# 外键
# queryset 反向查询集 反序列化
department = serializers.PrimaryKeyRelatedField(queryset=Department.objects.all())
duty = serializers.PrimaryKeyRelatedField(queryset=Duty.objects.all())
# 序列化的方法字段
department_name = serializers.SerializerMethodField(read_only=True)
# obj员工模型类对象
def get_department_name(self,obj):
# obj.department 部门对象
return obj.department.name
duty_name = serializers.SerializerMethodField(read_only=True)
def get_duty_name(self,obj):
return obj.duty.name
# 数据校验 attrs前端传过来的字典
def validate(self, attrs):
# 获取数据
name = attrs.get("name")
return attrs
def create(self, validated_data):
staff = Staff.objects.create(**validated_data)
return staff
# 重写update方法
def update(self, instance, validated_data):
instance.name = validated_data.get("name")
instance.save()
return instance
常用字段类型
字段 | 字段构造方式 |
---|---|
CharField | CharField(label=,min_length=2,max_length=10,allow_null=True,allow_blank=True,trim_whitespace=True) |
IntegerField | IntegerField(label=“ID”,read_only=True) |
PrimaryKeyRelatedField | PrimaryKeyRelatedField(queryset=Department.objects.all()) |
SlugField | SlugField(max_length=50, min_length=None, allow_blank=False) 正则字段,验证正则模式 [a-zA-Z0-9-]+ |
DecimalField | DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None) max_digits: 最多位数 decimal_palces: 小数点位置 |
TimeField | TimeField(format=api_settings.TIME_FORMAT, input_formats=None) |
ImageField | ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL) |
选项参数
参数名称 | 作用 |
---|---|
max_length | 最大长度:在反序列化时输出最大长度校验 |
min_lenght | 最小长度:在反序列化时进行输入最小长度校验 |
allow_blank/allow_null | 是否允许为空:在反序列化时允许传空白字符串,默认不允许 |
trim_whitespace | 截断左右空白字符,默认为True |
max_value | 最小值:在反序列时进行输入最大值校验 |
min_value | 最大值:在反序列化时进行输入最小值校验 |
通用参数
参数名称 | 作用 |
---|---|
read_only | 此字段仅用于序列化输出,默认False |
write_only | 表明该字段仅用于反序列化输入,默认false |
required | 表明该字段在反序列化时必须输入,默认True |
default | 反序列化时使用默认值,如果不指明,在传递时默认值为0 |
allow_null | 表明该字段是否允许传入None,默认False |
validators | 验证器,自己定义函数,实现复杂数据校验 |
label | 用于HTML展示API页面时,显示的字段名称 |
help_text | 用于HTML展示API页面时,显示的字段帮助提示信息 |
error_messages | 包含错误编号与错误信息的字典 |
重点:
- read-only:进行序列化输出时进行显示,但在反序列化验证不做校验
- write_only:在反序列化时进行校验,但在序列化时不进行输出该字段
3.4 ModelSerializer
class DepartmentModelSerializers(serializers.ModelSerializer):
class Meta:
model = Department
fields = '__all__'
read_only_fields = ["id",]
class DutyModelSerializers(serializers.ModelSerializer):
class Meta:
model = Duty
fields = '__all__'
read_only_fields = ["id",]
class StaffModelSerializers(serializers.ModelSerializer):
department_name = serializers.SerializerMethodField(read_only=True)
def get_department_name(self,obj):
return obj.department.name
duty_name = serializers.SerializerMethodField(read_only=True)
def get_duty_name(self,obj):
return obj.duty.name
class Meta:
model = Staff
fields = "__all__"
read_only_fields = ["id",]
和Serializer不同点
- 基于模型类自动生成一系列字段
- 基于模型类自动生成validators
- 默认实现update()和create()方法,不需要重写