Skip to content

Django ORM

https://docs.djangoproject.com/zh-hans/5.0/topics/db/queries
https://pythondjango.cn/django/basics/6-models-queryset-API/

查询

__isnull 判断 NULL

python
Blog.objects.filter(content__isnull=True)

__contains 包含

python
Blog.objects.filter(content__contains='python')
Blog.objects.filter(content__icontains='python')
  • __contains 区分大小写
  • __icontains 不区分大小写

__in / __range 范围

python
Blog.objects.filter(id__in=[1, 4, 7])
Blog.objects.filter(id__range=[2, 5])

__gt / __lt 大小比较

python
Blog.objects.filter(id__lte=10)
  • __gt 大于
  • __gte 大于等于
  • __lt 小于
  • __lte 小于等于

order_by 排序

python
Blog.objects.filter(id__lte=10).order_by(id)
Blog.objects.filter(id__lte=10).order_by(-id)
  • - 表示逆序

Q 对象

Q 对象用于使用或(OR)关系连接多条查询语句

python
from django.db.models import Q

Blog.objects.filter(
    Q(id__lte=10) |
    Q(username='zhangsan') |
    ~Q(content__contains='python')
)
  • Q 对象前面加 ~ 表示否定

操作对象

复制

python
a = Blog.objects.get(id=1)
a.id = None                 # 通过设置主键 id 为 None 来复制对象
a.save()

删除

python
Blog.objects.filter(id__gt=1).delete()

更新

python
a = Blog.objects.get(id=1)
data = {
    'username': 'lisi',
    'content': None,
    'like': 99,
}
a.__dict__.update(**data)

转为 dict 类型

python
res = Blog.objects.get(id=1).__dict__
# res = model_to_dict(res)  # 使用 model_to_dict 不会返回 auto now 的时间字段

Blog.objects.filter(id__gt=1).values()