通用视图,序列化器

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

常用字段类型

字段字段构造方式
CharFieldCharField(label=,min_length=2,max_length=10,allow_null=True,allow_blank=True,trim_whitespace=True)
IntegerFieldIntegerField(label=“ID”,read_only=True)
PrimaryKeyRelatedFieldPrimaryKeyRelatedField(queryset=Department.objects.all())
SlugFieldSlugField(max_length=50, min_length=None, allow_blank=False) 正则字段,验证正则模式 [a-zA-Z0-9-]+
DecimalFieldDecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None) max_digits: 最多位数 decimal_palces: 小数点位置
TimeFieldTimeField(format=api_settings.TIME_FORMAT, input_formats=None)
ImageFieldImageField(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()方法,不需要重写
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值