Django-ORM进阶操作02
来源:互联网 发布:百度新闻的评论 知乎 编辑:程序博客网 时间:2024/05/16 23:27
- select_related() 查询主动做连表
q = models.UserInfo.objects.all().filter(id__lt=60) # for row in q: # print(row.id,row.name,row.ut.title) # 这样进行查询性能不好,需要重新发sql请求在进行查询另外一张表中的数据,如果有10条数据就要进行11次查询 q = models.UserInfo.objects.all().values('name','id','ut__title').filter(id__lt=60) # for i in q: # print(i['name'],i['ut__title']) # 这样 进行了 优化 不回重复发送sql请求,到的结果内是字典 q = models.UserInfo.objects.all().select_related('ut').filter(id__lt=60) print(q.query) # for row in q: # print(row.id,row.name,row.ut.title) # select_related('ut') 相当 于 inner join 先连成一张表再进行查询
- prefetch_related() 不做连表,做多次查询
q = models.UserInfo.objects.all().prefetch_related('ut').filter(id__lt=60) for row in q: print(row.id,row.name,row.ut.title)# 如果查询的数据比较多,查询的次数比较多就不建议用select_related进行连表查询,毕竟连表查询毕竟有损耗。
# distinct() v = models.UserInfo.objects.values('age').distinct() for item in v: print(item) # 在mysql,sqlite中distinct()括号里是不能传参数, # select distinct nid from userinfo; # 而在 PostgreSQL 中 # models.UserInfo.objects.distinct('nid')
# reverse() v = models.UserInfo.objects.all().order_by('id').reverse() # reverse() 必须在order_by()后使用不能单独使用。 for i in v: print(i.id) v = models.UserInfo.objects.all().order_by('-id','name').reverse() # 相当于order_by('id','-name')
# only() v = models.UserInfo.objects.all() # [obj] v = models.UserInfo.objects.all().only('id','name') # [obj] for obj in v: print(obj.name,obj.id,obj.age) # 虽然加里only(),但是还能取出其他数据,但是不要这么取,会在再区表中进行查询影响效率,写几个取几个,不要多取 v = models.UserInfo.objects.values('id','name').all() # [{id,name}] for i in v: print(i)
# defer() # defer() 和only()相反,取括号内以外的数据 # using() # 指定数据库 # models.UserInfo.objects.all().using('db2') # setting.py ''' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }, 'db2': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'db2', 'USER': 'root', 'PASSWORD': '', 'HOST': '', 'PORT': '', } } '''
# dates() # # 根据时间进行某一部分进行去重查找并截取指定内容 # # kind只能是:"year"(年), "month"(年-月), "day"(年-月-日) # # order只能是:"ASC" "DESC" # # 并获取转换后的时间 # - year: 年 - 01 - 01 # - month: 年 - 月 - 01 # - day: 年 - 月 - 日 # models.DatePlus.objects.dates('ctime', 'day', 'DESC') # datetimes() # 根据时间进行某一部分进行去重查找并截取指定内容,将时间转换为指定时区时间 # kind只能是 "year", "month", "day", "hour", "minute", "second" # order只能是:"ASC" "DESC" # tzinfo时区对象 # models.DDD.objects.datetimes('ctime', 'hour', tzinfo=pytz.UTC) # models.DDD.objects.datetimes('ctime', 'hour', tzinfo=pytz.timezone('Asia/Shanghai')) ''' pip3 install pytz import pytz pytz.all_timezones pytz.timezone(‘Asia/Shanghai’) '''
# none() # 取空 v = models.UserInfo.objects.none() print(v)
# aggregate() from django.db.models import Count,Avg,Max # 聚合整张表 result = models.UserInfo.objects.aggregate(k=Count('id'), n=Count('age')) result = models.UserInfo.objects.aggregate(k=Count('id'),n=Count('age',distinct=True)) print(result) # count() # 计算个数
# get() v = models.UserInfo.objects.all().first() v = models.UserInfo.objects.get(id=1) # 如果id=1 不存在 则会报错,找到多个也会报错
# create() obj = models.UserInfo.objects.create(name='summer',age=23,pwd = 'ab456') # obj = models.UserInfo.objects.create(**{'name':'summer','age':123,'pwd':'ab456'}) print(obj.id) # 可以获取添加数据的自增ID # 另外一种添加方法 obj = models.UserInfo(name='autumn',age=23,pwd='ab123') obj.save()
# bulk_create() 批量添加 objs = [ models.UserInfo(name='autumn',age=23,pwd='ab123'), models.UserInfo(name='autumn1', age=23, pwd='ab123') ] models.UserInfo.objects.bulk_create(objs,10) # 10 代表一次提交10个对象 这个数最多别超过999
# get_or_create() 如果纯在则获取,否者创建 obj, created = models.UserInfo.objects.get_or_create(name='summer1', defaults={'age':123,'pwd':'ab456'}) # 先根据条件去查,如果存在name='summer1',则后面的default无效不执行。 print(obj,created) # created 为True或False
# update_or_create() 如果存在,则更新,否则,创建 obj, created = models.UserInfo.objects.update_or_create(name='summer1', defaults={'age':123,'pwd':'ab456'}) print(obj,created)
# exists() # 检查查询结果是否存在,返回True或False result = models.UserInfo.objects.filter(id=1111).exists() print(result)
# in_bulk # 根据主键进行查询。 res = models.UserInfo.objects.in_bulk([1,2,3]) # 相当于 res2 = models.UserInfo.objects.filter(id__in=[1,2,3])
# 如果需要的sql语句Django这个没有提供,可以用下面3中方法解决 # extra # 原生sql # raw # raw res = models.UserInfo.objects.raw('select id,name,age from app01_userinfo where id < 10') for item in res: print(item.age,item.name) # 为原生SQL设置参数 models.UserInfo.objects.raw('select id as nid from userinfo where nid>%s', params=[12,]) # 将获取的到列名转换为指定列名 name_map = {'age': 'new_age', 'name': 'new_name'} r = models.UserInfo.objects.raw('SELECT * FROM app01_userinfo', translations=name_map) for i in r: print(i.new_age) # 指定数据库 # models.UserInfo.objects.raw('select * from userinfo', using="default")
阅读全文
0 0
- Django-ORM进阶操作02
- Django-ORM进阶操作01
- django orm操作练习
- Django ORM 操作
- Django-ORM基础操作
- Django的ORM操作示例
- Django---orm多表操作
- Django---orm单表操作
- Django当中的ORM操作
- Django Orm 前端中跨表操作
- django 的orm的一些操作
- Django(三) ORM 数据库操作
- ###django 不依赖工程执行orm操作
- django orm
- django ORM
- Django ORM
- Django(四) ORM 外键操作及初识Ajax
- django orm操作2的练习源码内容
- 分布式服务框架 Zookeeper -- 管理分布式环境中的数据
- 知识链-消息中间件
- 知识链-分布式协调服务zookeeper
- 知识链-办公
- request.getScheme()的使用方法
- Django-ORM进阶操作02
- css中HSLA
- 代理模式
- 少犯智障问题!!!
- mysql in 和exists查询效率总结
- 基础总结篇之九:Intent应用详解
- 剑指offer面试题[22]-栈的压入、弹出序列
- Python列表、元组、字典使用
- 四大组件之ContentProvider