P6-day01-通用试图(P4复习)

1. DRF 视图

  1. Django REST framework是一个建立在django基础之上的Web应用开发框架,可以快速的开发REST API接口应用
  2. 提供了序列化器,简化序列化和反序列化的过程
  3. 提供了丰富的类试图,扩展类,视图集,简化代码
  4. 提供了认证,权限,频率,过滤,分页,接口文档等功能
  5. 提供了API的Web可视化界面,方便查看,检测接口

1.1 模型创建


from django.db import models

#BaseModel   父类
class BaseModel(models.Model):
   created_time = models.DateTimeField(auto_now_add = True)
   update_time = models.DateTimeField(auto_now = True)

# Create your models here.
# 部门表
# name 部门名称 varchar(30)数据库里的类型,django里是charfield
class Department(BaseModel):  # 表中添加测试数据,需先添加basemodel表;或者使用模型类操作
   """
   部门
   """
   name = models.CharField(max_length=30)

   class Meta:
       db_table = 'tb_department'

   def __str__(self):
       return self.name


#
# 职务表
# name 职务名称  varchar(30)
class Duty(BaseModel):
   """
   职务
   """
   name = models.CharField(max_length=30, verbose_name='职务名称')

   def __str__(self):
       return self.name

   class Meta:
       db_table = 'tb_duty'


# 员工表
# name, 姓名  varchar(30)
# sex, 性别 int  default 1
# phone, 手机号 varchar(11)
# email 邮箱  varchar(60)
# department 部门 fk
# duty 职务  fk
class Staff(models.Model):  # 不能继承BaseModel,会冲突
   """
   员工
   """
   SEX_CHOICE = (
       (1, '男'),
       (2, '女')
   )

   name = models.CharField(max_length=30, verbose_name='姓名')
   sex = models.IntegerField(choices=SEX_CHOICE, default=1, verbose_name='性别')
   phone = models.CharField(max_length=11, verbose_name='手机号')
   email = models.EmailField(max_length=60, verbose_name='邮箱')

   #外键
   department = models.ForeignKey(Department, on_delete=models.CASCADE)
   duty = models.ForeignKey(Duty, on_delete=models.CASCADE)

   # census_register = models.CharField(max_length=200, verbose_name='户籍')
   # picture = models.ImageField(upload_to='staff_pic', verbose_name='员工照片')

   def __str__(self):
       return self.name

   class Meta:
       db_table = 'tb_staff'

# 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"

2. 序列化器

序列化:将模型类对象转为字典,然后经过Response转为json字符串。作用是:将模型类对象转为字典
反序列化:将网络上的json字符串经过Resquert对象,转为字典或者类字典,然后经过序列化器转为模型类的对象。作用是:进行数据校验
两者都可以继承rest_framework.serializers.Serializer(序列化器)或rest_framework.serializers.ModelSerializer(模型类序列化器)
序列化器的作用是:减少代码量,提高编码效率

2.1 编写序列化器

from rest_framework import serializers
from .models import *

#部门的序列化器
class DepartmentSerializer(serializers.Serializer):
    id = serializers.IntegerField(label="ID",read_only=True)
    #  trim_whitespace  截断两边的空格
    name = serializers.CharField(label="部门名称",min_length=2,max_length=10,allow_null=True,
                                 allow_blank=True,trim_whitespace=True)

class DepartmentModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Department
        fields = "__all__"
        read_only_fields = ['id',]

# 职务的序列化器
class DutySerializer(serializers.Serializer):
    id = serializers.IntegerField(label="ID",read_only=True)
    #  trim_whitespace  截断两边的空格
    name = serializers.CharField(label="职务名称",min_length=2,max_length=10,allow_null=True,
                                 allow_blank=True,trim_whitespace=True)

class DutyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Duty
        fields = "__all__"
        read_only_fields = ['id',]

from rest_framework.exceptions import ValidationError
#  员工的序列化器
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)
    #外键
    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):
        # 返回部门对象   department.id  返回部门id
        return obj.department.name
    duty_name = serializers.SerializerMethodField(read_only=True)
    def get_duty_name(self,obj):
        return obj.duty.name

    # # 数据校验
    # def validate(self, attrs):    # attrs 前端传过来的数据--类字典
    #     name = attrs.get("name")
    #     phone = attrs.get("phone")

    # 重写create方法
    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

class StaffModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Staff
        fields = "__all__"
        read_only_fields = ['id',]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值