Django+Drf+drf-yasg 学习笔记

Django+Drf+drf-yasg 学习笔记

References:

Django drf 教程

Django 项目启动:

# 创建环境 
python -m venv venv 

# 安装依赖
pip install -r requirement.txt

# 检测模型文件修改(初次启动的时候可以直接 migrate)
python manage.py makemigrations app_name

# 创建新定义的模型的数据表
python manage.py migrate

# 收集静态文件至 STATIC_ROOT 中
python manage.py collectstatic --noinput

# 启动服务
python manage.py runserver

模型层(models)

作用: 构建和操纵 web 应用的数据

特点:由于 Django 的 orm 即对象关系映射模式,每一个模型映射一张数据库表

  • 每个模型都是一个 Python 的类,这些类继承 django.db.models.Model

  • 模型类的每个属性都相当于一个数据库的字段

  • Q: model_name.objects.get()model_name.objects.filter() 有什么区别

    • A: get 可以理解为精准匹配,通常返回值是一个定义的model对象,只有一条记录返回的时候才正常,也就说明get的查询字段必须是主键或者唯一约束的字段。当返回多条记录或者是没有找到记录的时候都会抛出异常。
    • filter返回 QuerySet 对象列表,有没有匹配的记录都可以。

字段关联关系

TODO

drf serializers

serializers 主要是对 Model 对象的操作,包括序列化(将 Python 数据类型转换为 json)和反序列化

  • 继承于 serializers.ModelSerializer
  • ModelSerializer 的父类是Serializer,是 在Serializer的基础上的扩展
  • 可以直接通过 Class Meta 里配置 fields 来对 model 进行序列化,简化了 Serializer 的操作
  • Meta里可以配置如下配置:
    • model:指定需要序列化的 model
    • depth:序列化时,读取数据的深度,默认是0,0表示仅展示该model对象的值,1表示为展示与该model对象直接外键关联的对象的相关数据,以此类推
    • fields:需要序列化的字段,是一个元组,__all__ 表示所有字段
    • exclude:不需要序列化的字段,默认是在全字段的情况下剔除不需要序列化的字段,
      • 注意:fields和exclude不能同时使用
    • extra_kwargs:给fields中的字段,添加额外的属性,如只读(read_only)、只写(write_only)等
    • read_only_fields:只读字段
    • validators:

备注:

  1. 在 Meta 外显示指定序列化字段时,可以通过source='xxx’来指定需要关联的外键对象的值,通过点分式获取对应的字段:
    owner = serializers.ReadOnlyField(source='owner.username')
    class Meta:
     ...
  1. 在 Meta 外显示指定序列化字段时,除了 1 中的方式可以使用 SerializerMethodField 通过在类上添加一个方法获取其值,添加任意类型的数据到对象的序列化表示上。

同时结合 drf-yasg @swagger_serializer_method 可以用这个装饰器来装饰 serializers.SerializerMethodField 来提示 swagger 如何描述这个字段

from django.contrib.auth.models import User
from django.utils.timezone import now
from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    days_since_joined = serializers.SerializerMethodField()

    class Meta:
        model = User
    @swagger_serializer_method(serializer_or_field=serializers.IntegerField)
    def get_days_since_joined(self, obj):
        return (now() - obj.date_joined).days

视图层(views)- 相当于 controller 层,负责处理用户的请求并返回响应

视图有基于函数的视图,有基于类的视图,一般使用 drf 之后,我们会继承 ModelViewSet 来创建基于类的视图:

  • 继承自各个 mixin 类和 GenericViewSet,所以默认就提供了增删查改相关方法,具体在代码中点击进入看就会发现

路由

关于 URL:

  • Django 规定每一个模式要求 URL 以一个斜线结尾
  • urlpatterns 都可以 include 其他 URLconf 模块,即将一部分 URL 放置于其他 URL 下面
  • URL 模式可以使用正则表达式,使用 re_path() 而不是 path()

而对于 drf:常用路由是 DefaultRouter

  • drf 添加了对自动 URL 路由到 Django 的支持,提供了一种简单、快速和一致的方式将试图逻辑连接到一组 URL
  • 常用的是 DefaultRouter,默认会不全常见的 CRUD 接口
  • 自动基于 viewSet 生成 xxx-list 以及 xxx-detail,自定义的接口,默认将 “_” 替换成 “-”

管理

这是 Django 最强大的部分之一,它从你的模型中读取元数据,提供一个快速的、以模型为中心的界面,受信任的用户可以管理你网站的内容(或者说元数据)。

  1. step1: 从 根 URLConf 中创建 admin 路由
  2. step2: python manage.py createsuperuser 创建管理员账号
  3. step3: 继承 ModelAdmin 用来处理自定义界面
  4. 其他处理主题的方式可以参考 https://docs.djangoproject.com/zh-hans/3.2/ref/contrib/admin/#hooking-adminsite-to-urlconf

管理静态文件

  1. 配置静态文件,定义 STATIC_URL STATIC_ROOT
  2. 配置 whiternoise 提供静态文件服务(可以不依赖像 nginx 这样的 external service)
  3. python manage.py collectstatic

你可能感兴趣的:(BE,python,Django,drf,drf-yasg)