django ORM用法之复杂查询

1.去重查询
#values.distinct()去重字段,如果不使用order_by('field'),将会默认字段去重
models.objects.values('field').filter(delete=0).distinct().order_by('field')
2.查看查询的sql语句
from django.db import connection
print(json.dumps(connection.queries))
3.查询条数限制
#django没有limit语法,需要自己处理查询条数
models.objects.filter()[(int(page) - 1) * int(page_size):int(page) * int(page_size)] 
4.查询条件排除
exclude(status=1)
5.批量插入数据
#批量存入数据的时候,如果直接for每次存入一条,将会大大影响数据库性能,这里django提供了批量存入函数。
querysetlist = []
for i in range(0,100):
    code = Random().randint(1, 1000000)
    querysetlist.append(models(code=code)
models.objects.bulk_create(querysetlist)
6.关联字段取别名
from django.db.models import F
User.objects.annotate(uid=F('user__id'),username=F('user__username')).values('uid','username','status').filter()
7.范围查询
#时间访问查询案例
models.objects.filter(create_time__range=(begin,end))
#大小范围查询
models.objects.filter(status__lt=1)  小于
models.objects.filter(status__lte=1) 小于等于
models.objects.filter(status__gt=1)  大于
models.objects.filter(status__gte=1) 大于等于
8.or查询 动态添加条件
from django.db.models import Q
query=Q()
#查询状态包含1、2、3、4的数据
for i in [1,2,3,4]:
    query.add(Q(**{'status__contains': i}), Q.OR)
9.OR拼接查询
#两个不同字段的区间范围判断
query = Q() 
query.add(Q(**{'min__gte': 0}) & Q(**{'max__lte': 50}), Q.OR)
10.分组聚合
#跟进某个字段分组,统计该记录出现的次数
Model.objects.values("field").annotate(counts=Count(id))
#查询结果:<QuerySet [{'field': 1, 'counts': 3}, {'field': 25, 'counts': 2}}]>
11.统计两个字段的总和再相加
#没有数据则返回none
total=(models.objects.filter().aggregate(total=Sum("field")+Sum("field")))['total']
12.查询前一天的数据
import datetime
time = (datetime.datetime.now() + datetime.timedelta(days=-1)).date()
data = UserOrder.objects.filter(create_time__contains=time)
13.查询两个字段相乘后的总和
from django.db import models
model.objects.filter().aggregate(total=Sum(F("num") * F("amount"), output_field=models.DecimalField(max_digits=10, decimal_places=2)))

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会代码的小林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值