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='ayuu')
# 等价于
Book.objects.filter(deleted=False, title__contains='ayuu')

查询

QuerySet API

QuerySet 实例的 API 参考。包含

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

查询器 Lookup

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

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

对应 SQL 是

sql
SELECT * FROM user WHERE username LIKE '%ayuu%';
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

参考