python查询在查询_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])
由于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默認是延遲加載
總結
以上是生活随笔為你收集整理的python查询在查询_python 查询,子查询以及1对多查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python关联分析引擎_PowerBI
- 下一篇: python中sin函数在哪个模块中_从