Easton's Blog Easton's Blog
首页
  • 编程语言

    • Python
  • 框架

    • Django
  • Mdn (opens new window)
  • HTML
  • CSS
  • JavaScript
  • Mysql
  • PostgreSQL
  • Elasticsearch
  • MongoDB
  • Redis
  • 服务器命令
  • Docker
  • GIT
  • 摄影
  • 草稿
  • 归类方式

    • 分类
    • 标签
    • 归档
  • 关于博客

    • 博客教程
    • 友情链接
    • 关于
导航站
GitHub (opens new window)

Easton Yang

爱生活😊爱学习
首页
  • 编程语言

    • Python
  • 框架

    • Django
  • Mdn (opens new window)
  • HTML
  • CSS
  • JavaScript
  • Mysql
  • PostgreSQL
  • Elasticsearch
  • MongoDB
  • Redis
  • 服务器命令
  • Docker
  • GIT
  • 摄影
  • 草稿
  • 归类方式

    • 分类
    • 标签
    • 归档
  • 关于博客

    • 博客教程
    • 友情链接
    • 关于
导航站
GitHub (opens new window)
  • Python

  • Django

    • django基础
    • django_orm数据处理
      • 1.常用关键字参数
      • 2.常用方法
      • 3.Q 查询
      • 4.聚合查询(aggregate,annotate)
      • 5.数据存储
      • 5.F 表达式
      • 6.pk
      • 7.删除
      • 8.执行原生 sql
      • 9.事务
      • 4.性能
  • 后端
  • Django
eastonyangxu
2023-06-26
目录

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.常用方法

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) :返回指定的字段数据 返回值&lt;queryset[{'title':'aa','pirce':12},{'title':'bb','pirce':33}]
values_list(*field) :返回指定的字段数据 返回值&lt;queryset[('aa',12),('bb',33)]
distinct() :从返回结果中剔除重复纪录
1
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

# 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

# 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

# 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

# 6.pk

# 主键 (pk) 查询快捷方式 ,id为主键时
Blog.objects.get(id=14)
Blog.objects.get(pk=14)
1
2
3

# 7.删除

# delete()
Entry.objects.filter(pub_date__year=2005).delete()
1
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

# 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

# 4.性能

性能官方文档 (opens new window)

#Django
上次更新: 2023/08/08, 20:00:46
django基础

← django基础

最近更新
01
攻略制作要点
07-18
02
摄影主题拍摄
07-18
03
延时摄影剧本
07-18
更多文章>
Theme by Vdoing | Copyright © 2023-2024 Easton Yang | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式