python 查询,子查询以及1对多查询

1.添加数据:
# 方法1:对象.save()
book = Book(**kwargs)
book.save()

# 方法2:类.create(**kwargs)
Book.create(**kwargs)

2.删除数据:拿到对象list,然后.delete()
Book.objects.filter(title='').delete()

3.修改数据:
# 方法1:拿到集list,然后update(**kwargs)
Book.objects.filter(title='t1').update(title='t2',auth='测试')
# 方法2:使用单对象,修改后.save
b = Book.objects.get('')
b.title = ''#注意这里不能使用b['title'],必须使用b.title
b.save()

4.单表查询:
models.Tb1.objects.filter(id__gte=1) # 获取id大于等于1的值
models.Tb1.objects.filter(id__lte=10) # 获取id小于10的值
models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值

# in范围比较
models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
# not in
models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in
# range
models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and

# isnull
Entry.objects.filter(pub_date__isnull=True)

# 其他类似
startswith,istartswith, endswith, iendswith,
# contains包含
models.Tb1.objects.filter(name__contains="ven")
models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
models.Tb1.objects.exclude(name__icontains="ven")
# regex正则匹配,iregex 不区分大小写
Entry.objects.get(title__regex=r'^(An?|The) +')
Entry.objects.get(title__iregex=r'^(an?|the) +')

# 升序
orderby('id')
orderby('-id') # 降序列
# 切片
models.Tb1.objects.all()[10:20]

#查询的字段
values_list(**fields) #他的每个元素是tuple,实际用到它的地方只有只取一个字段,同时设置flat=true,如下:

values_list(‘字段’,flat=True)返回一个list,   一般用下面的values(**fields),如下:
values(**fields) #它的每个元素是字典

5.其他查询:
5.1: 多表查询:基于双下划线的跨表查询
5.2: aggregate聚合函数: models.Book.objects.all().aggregate(Avg('price'), Sum('price')) #aggregate(n个统计函数)
5.3: annotate分组查询: gs = list(RebotComputer.objects.values('status').annotate(count = Count('*')).values('status','count').order_by())    以后写分组统计都按这个完整范式来写
第一个values是分组字段(如果不写默认会按id分组),第二个values是需要查询的字段, order_by():默认的排序字段也会自动加入到GROUP BY子句中. 要避免这样的情况,只需在查询时清空默认的order by

一般只需要会RebotComputer.objects.values('status').annotate(sum= Sum('xxx')) 即可,意思按status分组求xxx的和

5.4 F查询,Q查询
5.5.复杂的sql如果不会写,可以使用extra来做: extra__gte = '(total_draw + money + bank_money - total_recharge)>=' + str(total_yl__gte) ;  query = query.extra(where=[extra__gte])

6.关联查询优化: 参见https://www.imooc.com/video/18464

由于django默认是懒加载,所以由子对象取父对象时会由很多条sql,以下是通过急迫抓取优化:

一对1,多对1-->可以使用select_related('映射的外键对应的对象名')来急迫获取父对象;

多对多-->prefetch_related('xxx')获取对象的集合

1对多-->Agent.objects.filter(name='00').agent_qref_set.all(),其中agent_qref_set是字表名称加_set(agent_qref_set是django默认1对多的集合对象写法,不用写代码申明),如果有foreignKey中有别名,可以使用别名

---------------------------------------------------------------------------------

1.子查询:

if not self_id in [ADMIN_ID, BOSS_ID]: 
  listIds = Broker.objects.using('broker').filter(top_parent_id=self_id).values_list('user__id', flat=True) // ① 

rows = Apply.objects.using('broker').filter(**kwargs)[offset:offset+limit]// ②

 

注意 // ① 不会立即执行,在②执行时作为子查询条件

 

 

2.1对多级联:

user=User.objects.get(pk=1)
permissions = user.permissions.all() #必须调用all或values(field1,field2,...)来查询查询关联的permissions, python默认是延迟加载

转载于:https://www.cnblogs.com/yanjunwu/p/9025064.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值