Skip to content
信息
创建于
2025-04-10 00:16
更新于
2025-05-21 17:11
保质期
新鲜度
0%

Django & REST Framework

  1. 这里主要指 Django 和 Django REST Framework 两个框架。
  2. 按照 废弃政策 的发行节奏,Django 从 2.0 开始只发行 x.0、x.1 和 x.2 LTS 三个大的子版本。
  3. 技术选型前可以参考 Python 兼容性,旧版本的兼容性可以在 上面 旧版本的 Django 文档中查到。
  4. Django 文档非常齐全,首页把文档全部掰碎了摊开,包含新手起步流程和熟手进阶方向,只需按图索骥即可解决大部分问题。
  5. Django REST Framework 在导航栏把文档划分成“教程”“API 参考”“话题” 三个部分,基本对应新手、进阶、深入三个阶段。

配置

Django 的配置存放在是以一个 Python 包的形式存在,因此你可以借助 Python 语法实现很多操作。

  1. 缓存部分:https://docs.djangoproject.com/zh-hans/5.2/ref/settings/#caches
  2. 数据库部分:https://docs.djangoproject.com/zh-hans/5.2/ref/settings/#databases

Django REST Framework 的配置亦是存放在 settings.py 中,且统一存放在一个变量 REST_FRAMEWORK 中。

如何导入配置?如何添加自定义配置?命名风格?对比默认值,我修改过什么配置?

区分生产环境

  1. 假设配置在 ./myproject/settings.py

  2. 复制一份 settings 到 ./myproject/settings_prod.py 来进行单独修改。

  3. 设置环境变量

    bat
    set DJANGO_SETTINGS_MODULE=myproject.settings_prod

    或者在运行时添加参数

    shell
    python manage.py runserver --settings=myproject.settings_prod

美化配置

因为 Settings 以一个 Python 包的形式存在,因此可以用形参对固定配置加以区分:

./我的项目/settings.py
python
DATABASES = {
    'default': dict(
        ENGINE='django.db.backends.postgresql',
        NAME='我的项目',
        USER='postgres',
        PASSWORD='我的密码',
        HOST='localhost',
        PORT='5432',
    ),
}

模型层

包含字段类型、字段参数、索引、约束、关联、Meta、查询集、查询表达式、条件表达式等与数据库相关的参考。

字段类型

Meta

自定义管理器

python
from django.db import models

class ExistenceManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(deleted=False)

class Book(models.Model):
    title = models.CharField('标题', max_length=100)
    deleted = models.BooleanField('已删除', default=False, blank=True)

    objects = models.Manager()  # 默认管理器,在此处声明是为了确保默认情况下可以拿到表中所有数据。
    existences = ExistenceManager()  # 过滤掉已删除的数据。

Book.existences.filter(title__contains='aixcyi')
# 等价于
Book.objects.filter(deleted=False, title__contains='aixcyi')

查询

QuerySet API

QuerySet 实例的 API 参考。包含

  • 返回和不返回新 QuerySet 对象的方法;
  • 适用的运算符 &(即 AND)、|(即 OR)、^(即 XOR);
  • Field 查找器 Lookup
  • 聚合函数 Sum() Count() Max() Min() 等;
  • Q() Prefetch() 等相关查询工具。

查询器 Lookup

一种方便的字段查询方式,格式如 __contains
比如查询 User 表 username 字段是否包含 aixcyi 这段字符串,ORM 方法是

python
User.objects.filter(username__contains='aixcyi')

对应 SQL 是

sql
SELECT * FROM user WHERE username LIKE '%aixcyi%';
python
from django.db.models import Lookup

class HasBits(Lookup):
      """
      检测字段值是否含有某个或某些比特。
      """
      lookup_name = "hasb"  # 想知道在哪里用过,只需全局搜索 "__hasb="
  
      def as_sql(self, compiler, connection):
          lhs, lhs_params = self.process_lhs(compiler, connection)
          rhs, rhs_params = self.process_rhs(compiler, connection)
          params = lhs_params + rhs_params
          return "%s & %s != 0" % (lhs, rhs), params

比如查询 Goods 表 sale_channels 字段是否包含比特 216,ORM 方法是

python
Goods.objects.filter(sale_channels__hasb=2 | 16)

对应 SQL 是

sql
SELECT * FROM goods WHERE sale_channels & (2 | 16) != 0;

函数 & 表达式

数据库约束

数据库事务

原生 SQL 查询

视图层

URL & 反向解析

请求实例 Request

响应实例 Response

兼容性简表

Django

5.25.15.04.24.14.03.23.13.02.22.12.0
3.13
3.12
3.11
3.10
3.9
3.8
3.7
3.6
3.5
3.4

Django REST framework

5.25.15.04.24.14.03.23.13.02.22.12.0
3.16
3.15
3.14
3.13
3.12
3.11
3.10
3.9

参考