Django模型类3

266 阅读1分钟

聚合查询与原生sql

F对象和Q对象

F对象,表示一行记录的某个字段的信息,而不获取数据。

from django.db import models
#在高并发处理中,防止操作错误
user = User.objects.get(username="jack")
user.age = models.F("age") + 1 #原来的值加1

#同一行数据的字段之间的比较
user = User.objects.filter(age__gt=models.F("oage"))

Q对象,包裹查询条件,表示一个查询条件对象,多个条件可以进行逻辑运算

Q(age__gt=5)&Q(age__lt=10) #且
Q(age__gt=5)|Q(username__exact="jack") #或
~Q(age__exact=5) #非

#查询姓名为‘jack’或者年龄不为20的用户
from django.db import models
queryset = User.objects.filter(models.Q(username="jack")|~models.Q(age__exact=20))

聚合

对查询结果,进行统计分析

from django.db.models import Sum,Avg,Min,Max,Count
#整表聚合
d = User.objects.aggregate(f=Count("id"))
#{"f":100}
#queryset聚合
User.objects.filter(username__contains="jack").aggregate(r=Count('id'))

#分组聚合
#先拿到一列的值
c = User.objects.values("addr",...)
#分组,聚合
c.annotate(r=Count("id"))
#<QuerySet [{"addr":"China","r":5},{"addr":"B","r":8}]>

#例子
User.objects.values("email").annotate(r=Count("username"))
Out[35]: <QuerySet [{'email': 'test email', 'r': 1}, {'email': '1000000', 'r': 1}, {'email': 'g1', 'r': 1}, {'email': 'g2', 'r': 3}, {'email': 'g3', 'r': 1}, {'email': '944582529@qq.com', 'r': 1}, {'email': '123', 'r': 1}, {'email': '123456', 'r': 1}]>

原生是sql

User.objects.raw(sql,[ parameter,]) 返回RawQuerySet,只能查询,遍历取数据,不能做其他操作 不建议使用

User.objects.raw("select * from user_table where id=%s"%("5 or true"))
#以上查询出所有的数据,自己拼接的方式
#select * from user_table where id=5 or true;

#参数化的方式,防止sql注入
User.objects.raw("select * from user_table where id=%s",["5 or true"])
#django 拼接的结果 select * from user_table where id='5 or true'
#查询时,只取第一个5转为整数

#游标方式
from django.db import connection
with connection.cursor() as cur:
	cur.execute(sql,[]) #写入
	cur.execute("insert into user_table(username,password,email,phone,is_delete,created_time,updatd_time) values(%s,%s,%s,%s,%s,%s,%s)",["lucy","123","qq","234567",False,"2019/11/9","2019/11/9"])

#原生sql插入数据时,自己处理所有的字段

上一篇:Django模型类2