这里先记录下常用的操作,后续整理。
数据库更新
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 创建、更新的时候自动获取当前时间 |