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)))

版权声明:本文为weixin_46105038原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。