- 这里主要指 Django 和 Django REST Framework 两个框架。
- 按照 废弃政策 的发行节奏,Django 从 2.0 开始只发行 x.0、x.1 和 x.2 LTS 三个大的子版本。
- 技术选型前可以参考 Python 兼容性,旧版本的兼容性可以在 上面 旧版本的 Django 文档中查到。
- Django 文档非常齐全,首页把文档全部掰碎了摊开,包含新手起步流程和熟手进阶方向,只需按图索骥即可解决大部分问题。
- Django REST Framework 在导航栏把文档划分成“教程”“API 参考”“话题” 三个部分,基本对应新手、进阶、深入三个阶段。
Django 的配置存放在是以一个 Python 包的形式存在,因此你可以借助 Python 语法实现很多操作。
Django REST Framework 的配置亦是存放在
settings.py
中,且统一存放在一个变量REST_FRAMEWORK
中。
如何导入配置?如何添加自定义配置?命名风格?对比默认值,我修改过什么配置?
假设配置在
./myproject/settings.py
。复制一份 settings 到
./myproject/settings_prod.py
来进行单独修改。设置环境变量
batset DJANGO_SETTINGS_MODULE=myproject.settings_prod
或者在运行时添加参数
shellpython manage.py runserver --settings=myproject.settings_prod
因为 Settings 以一个 Python 包的形式存在,因此可以用形参对固定配置加以区分:
DATABASES = {
'default': dict(
ENGINE='django.db.backends.postgresql',
NAME='我的项目',
USER='postgres',
PASSWORD='我的密码',
HOST='localhost',
PORT='5432',
),
}
包含字段类型、字段参数、索引、约束、关联、Meta、查询集、查询表达式、条件表达式等与数据库相关的参考。
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
对象的方法;- 适用的运算符
&
(即AND
)、|
(即OR
)、^
(即XOR
);Field
查找器Lookup
;- 聚合函数
Sum()
Count()
Max()
Min()
等;Q()
Prefetch()
等相关查询工具。
一种方便的字段查询方式,格式如
__contains
。
比如查询 User 表 username 字段是否包含 ayuu 这段字符串,ORM 方法是pythonUser.objects.filter(username__contains='ayuu')
对应 SQL 是
sqlSELECT * FROM user WHERE username LIKE '%ayuu%';
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 字段是否包含比特
2
或16
,ORM 方法是pythonGoods.objects.filter(sale_channels__hasb=2 | 16)
对应 SQL 是
sqlSELECT * FROM goods WHERE sale_channels & (2 | 16) != 0;
Request
Response
HttpResponse 对象
https://docs.djangoproject.com/zh-hans/5.2/ref/request-response/#httpresponse-objects