django_orm数据处理
# 1.常用关键字参数
# __exact 精确等于 like 'aaa' ,这种情况可以直接使用=
# __iexact 精确等于 忽略大小写 ilike 'aaa'
# __contains 包含 like '%aaa%'
# __icontains 包含,忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
# __startswith 以…开头
# __istartswith 以…开头 忽略大小写
# __endswith 以…结尾
# __iendswith 以…结尾,忽略大小写
# __range 在…范围内
# __year 日期字段的年份
# __month 日期字段的月份
# __day 日期字段的日
# __gt 大于>
# __gte 大于等于>=
# __lt 小于<
# __lte 小于等于<=
# __isnull 是否为None
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 2.常用方法
all() : 查询所有结果 满足切片返回,返回前5个:all()[:5] 6至10:all()all()[5:10]
filter(**kwargs) :根据查询条件(**kwargs)返回满足条件所有的结果
get(**kwargs) :根据查询条件(**kwargs)返回满足条件的一个结果,如果结果超过一个或者没有都会报错
exclude(**kwargs) :根据查询条件(**kwargs)返回不满足条件的所有结果
order_by(*field) :排序,用法:order_by('-price') 降序
reverse() :对查询结果反向
count() :返回查询结果的数量
first() : 查询第一个结果
last() :查询最后一个结果
exists() :如果QuerySet包含数据返回TRUE,否则返回False
values(*field) :返回指定的字段数据 返回值<queryset[{'title':'aa','pirce':12},{'title':'bb','pirce':33}]
values_list(*field) :返回指定的字段数据 返回值<queryset[('aa',12),('bb',33)]
distinct() :从返回结果中剔除重复纪录
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 3.Q 查询
from django.db.models import Q
# |:or,常用 &:and ^: xor异或,不常用 ~:not
# Q(question__startswith='What')
# Q(question__startswith='Who') | Q(question__startswith='What')
# Q(question__startswith='Who') | ~Q(pub_date__year=2005)
Poll.objects.get(
Q(question__startswith='Who'),
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)
# 类似于:
# SELECT * from polls WHERE question LIKE 'Who%'
# AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 4.聚合查询(aggregate,annotate)
from django.db.models import Avg, Max, Count, Min
Avg:平均值 Book.objects.aggregate(Avg('price')) return:{'price__avg': 34.35}
Max:最大 Book.objects.aggregate(Max('price')) return:{'price__max': Decimal('81.20')}
最大值-平均值:Book.objects.aggregate(price_diff=Max('price', output_field=FloatField()) - Avg('price')) return:{'price_diff': 46.85}
当指定 annotate() 子句,QuerySet 中的每一个对象将对指定值进行汇总
前五:pubs = Publisher.objects.annotate(num_books=Count('book')).order_by('-num_books')[:5]
第一的数量:pubs[0].num_books 1323
annotate() 和 values() 的顺序
如果 values() 子句在 annotate() 之前,就会根据 values() 子句产生的分组来计算注解
如果 annotate() 子句在 values() 之前,就会根据整个查询集生成注解。这种情况下,values() 子句只能限制输出的字段
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 5.数据存储
# create(**kwargs) :创建对象并一步保存
p = Person.objects.create(first_name="Bruce", last_name="Springsteen")
# save() : 插入数据,调用save时才执行
p = Person(first_name="Bruce", last_name="Springsteen")
p.first_name = 'Tom' # 这里可以修改数据
p.save()
# get_or_create(**kwargs) :如果存在就查询,不存在就创建。如果找到多个对象,会引发 MultipleObjectsReturned
obj, created = Person.objects.get_or_create(
first_name='John',
last_name='Lennon',
defaults={'birthday': date(1940, 10, 9)},
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 5.F 表达式
from django.db.models import F
reporter = Reporters.objects.get(name='Tintin')
reporter.stories_filed = F('stories_filed') + 1
reporter.save()
Reporter.objects.update(stories_filed=F('stories_filed') + 1)
Entry.objects.filter(number_of_comments__gt=F('number_of_pingbacks') * 2)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 6.pk
# 主键 (pk) 查询快捷方式 ,id为主键时
Blog.objects.get(id=14)
Blog.objects.get(pk=14)
1
2
3
2
3
# 7.删除
# delete()
Entry.objects.filter(pub_date__year=2005).delete()
1
2
2
# 8.执行原生 sql
# raw(sql_str, [params])
first_person = Person.objects.raw('SELECT * FROM myapp_person LIMIT 1')[0]
# 执行参数化查询:lname = 'Doe'
Person.objects.raw('SELECT * FROM myapp_person WHERE last_name = %s', [lname])
# 注意:若你使用了字符串插入或用引号包裹占位符,你正处于 SQL 注入的风险中。
# 要避免 SQL 注入,你绝对不能在 SQL 字符串中用引号包裹 %s 占位符
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 9.事务
# 文档链接 https://docs.djangoproject.com/zh-hans/4.1/topics/db/transactions/
from django.db import transaction
@transaction.non_atomic_requests # 该装饰器会为指定视图取消 ATOMIC_REQUESTS 的影响
def my_view(request):
do_stuff()
@transaction.atomic # 函数事务,不常用
def viewfunc(request):
# This code executes inside a transaction.
do_stuff()
def viewfunc(request):
# This code executes in autocommit mode (Django's default).
do_stuff()
with transaction.atomic(): # 根据实际业务事务,常用
# This code executes inside a transaction.
do_more_stuff()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 4.性能
上次更新: 2023/08/08, 20:00:46