这里先记录下常用的操作,后续整理。
数据库更新
django 有一个 django_migrations 用于记录每一次更新。结构如下:
1 | > desc django_migrations; |
app 是表的名字, name 前面的序号是变更次数;
Migrations 步骤如下:
- 修改数据库模型;
pyhton manage.py makemigrations my_model
, 如果没有改动,使用—empty
参数;python manage.py migrate
.
需要注意的是migrate
并不是原子操作,也不会加锁,例如在k8s多个pod中执行,django_migrations
表中可能会出现多条记录。
我们也可以在migartions 中执行脚本,例如:
1 | from django.db import migrations |
有时候自动 makemigrations
的脚本并不能一次解决我们的问题,例如增加一列 uuid
,如果直接插入,所有 uuid
都是一样的,可以先设置为空,再把空的填充,然后设置字段不可为空。
1 | from django.db import migrations, models |
数据获取
1 | # 获取所有对象 |
特殊操作
- 大于:
__gt
大于等于:
__gte
小于:
__lt
小于等于:
__lte
包含:
__contains
开头是:
__startswith
结尾是:
__endswith
其中之一:
__in
范围:
__range
1 | # in |
如果需要 <>
, 则使用 Q
1 | from django.db.models import Q |
创建
1 | # 更新或者创建 |
raw
Django 可以直接执行 sql 脚本,需要注意的是 django 的 raw 查询必须要有primary key
字段,因为返回的是Model 的 QuerySet列表。新增的属性不要也是放到 Model的属性中的,所以名字不要包含特殊字符,这点确实有点蛋疼。
1 | Person.objects.raw('SELECT id, first_name, last_name, birth_date FROM myapp_person') |
常用
Group by 使用
1 | from django.db.models import Count |
统计数量
如果只是为了获取数量,使用 count
就行,不要使用 len(QuerySet)
, 这会获取所有的数据,消耗大量内存。
1 | QuerySet.count() |
逻辑操作
1 | from django.db.models import Q |
Model 参数说明
- null: 默认为False,对应的字段如果没有设置则为空字符串(””), 如果设置了,对应 None;
自动插入/更新时间
1 | # auto_now 创建、更新的时候自动获取当前时间 |