Django的orm补充
参考文献:https://www.cnblogs.com/wupeiqi/articles/6216618.html
1.编写models示例
from django.db import models
class Foo (models.Model):
name=models.CharField(max_length=16 )
class UserType (models.Model):
'''
用户类型
'''
title=models.CharField(max_length=16 )
uf=models.ForeignKey(to='Foo' ,on_delete=models.CASCADE,null=True )
class UserInfo (models.Model):
'''
用户表
'''
username=models.CharField(max_length=16 )
age=models.IntegerField()
ut=models.ForeignKey('UserType' ,on_delete=models.CASCADE)
models.IntegerField()
def __str__ (self ):
return "%s------%s" %(self.id ,self.username)
2.排序分组
2.1 排序
def login_orm (request ):
user_list=models.UserInfo.objects.all ()
print (user_list)
return HttpResponse("加油!ORM 马上就要完成了!" )
user_list=models.UserInfo.objects.all ().order_by('-id' ,'name' )
2.2 分组
from django.db.models import Count
user=models.UserInfo.objects.values("ut_id" ).annotate()
print (user.query)
user_list = models.UserInfo.objects.values("ut_id" ).annotate(xx=Count('id' ))
print (user_list.query)
print (user_list)
user_list=models.UserInfo.objects.values("ut_id" ).annotate(xx=Count('id' )).filter (xx__gt=1 )
print (user_list.query)
filter(id__gt=1)
在annotate前面表示where
,在annotate后面表示having
2.3 其他基本查询
user1=models.UserInfo.objects.filter (id__lt=1 )
user2=models.UserInfo.objects.filter (id__gt=1 )
user3=models.UserInfo.objects.filter (id__lte=1 )
print (user3.query)
user4 = models.UserInfo.objects.filter (id__gte=1 )
user=models.UserInfo.objects.exclude(id =1 )
print (user.query)
user5 = models.UserInfo.objects.filter (id__in=[1 ,2 ,3 ])
user6 = models.UserInfo.objects.filter (id__range=[1 ,3 ])
print (user6.query)
print (user5.query)
user7=models.UserInfo.objects.filter (username__startswith='逻' )
user8=models.UserInfo.objects.filter (username__contains='尔' )
print (user7.query)
print (user8.query)
print (user7)
print (user8)
return HttpResponse("加油!ORM 马上就要完成了!" )
补充:查看orm产生的sql语句可以使用对象.query
3.F,Q查询
3.1 F更新操作
from django.db.models import F
models.UserInfo.objects.all ().update(age=F("age" )+1 )
3.2 Q查询的使用
使用场景 :经常在OR 使用 |
和and 使用 &
关系中使用,也会在动态增加筛选条件的时候进行使用(例如:CMDB项目);
v=models.UserInfo.objects.filter (Q(id__gt=1 ))
print (v.query)
print (v)
v=models.UserInfo.objects.filter (Q(id =3 )|Q(id =2 ))
print (v.query)
print (v)
v=models.UserInfo.objects.filter (Q(ut_id=1 )&Q(id =1 ))
print (v.query)
print (v)
q1=Q()
q1.connector='OR'
q1.children.append(('id__gt' ,1 ))
q1.children.append(('id' ,10 ))
q1.children.append(('id' ,9 ))
q2=Q()
q2.connector='OR'
q2.children.append(('id' ,1 ))
q2.children.append(('id' ,2 ))
q2.children.append(('id' ,3 ))
con=Q()
con.add(q1,'AND' )
con.add(q2,'AND' )
v=models.UserInfo.objects.filter (con)
print (v)
print (v.query)
按照关系生成对应的 SQL 条件与关系
F,Q的总结
4.1 使用
使用场景 :较为复杂的 SQL 查询。(注:SQL 过于复杂时建议使用原生sql)
一般使用的时候建议边修改边打印 sql 进行修改。
v=models.UserInfo.objects.all ().extra(
select={'newid' :'select count(1) from app01_usertype where id >%s' },
select_params=[1 ,],
order_by=['-age' ],
tables=['app01_usertype' ],
where=['age>%s' ],
params=[18 ,]
)
print (v)
print (v.query)
产生的 sql 语句;
SELECT (select count(1 ) from app01_usertype where id >1 ) AS "newid" , "app01_userinfo" ."id" , "app01_userinfo" ."username" , "app01_userinfo" ."age" , "app01_userinfo" ."ut_id" FROM "app01_userinfo" , "app01_usertype" WHERE (age>18 ) ORDER BY "app01_userinfo" ."age" DESC
补充 :每个函数只要返回QuerySet的对象可以继续使用QuerySet 的方法;相当于链式法则;
5. Django 执行原生sql
1.首先在配置文件中配置数据库的连接
2.在对应的模块中进行导入
from django.db import connection,connections
connection.connect()
conn = connection.connection
import pymysql
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute("""SELECT * from app01_userinfo""" )
row = cursor.fetchone()
connection.close()
6.多个数据库
6.1 配置文件设置
6.2 使用
models.UserInfo.objects.all ().using("db2" )
from django.db import connection,connections
cursor=connections['db2' ].cursor()
7.补充:QuerSet函数
def all (self )
def filter (self, *args, **kwargs )
def exclude (self, *args, **kwargs )
def select_related (self, *fields )
性能相关:表之间进行join连表操作,一次性获取关联的数据。
model.tb.objects.all ().select_related()
model.tb.objects.all ().select_related('外键字段' )
model.tb.objects.all ().select_related('外键字段__外键字段' )
def prefetch_related (self, *lookups )
性能相关:多表连表操作时速度会慢,使用其执行多次SQL查询在Python代码中实现连表操作。
models.UserInfo.objects.prefetch_related('外键字段' )
from django.db.models import Count, Case, When, IntegerField
Article.objects.annotate(
numviews=Count(Case(
When(readership__what_time__lt=treshold, then=1 ),
output_field=CharField(),
))
)
students = Student.objects.all ().annotate(num_excused_absences=models.Sum(
models.Case(
models.When(absence__type='Excused' , then=1 ),
default=0 ,
output_field=models.IntegerField()
)))
def annotate (self, *args, **kwargs )
from django.db.models import Count, Avg, Max, Min, Sum
v = models.UserInfo.objects.values('u_id' ).annotate(uid=Count('u_id' ))
v = models.UserInfo.objects.values('u_id' ).annotate(uid=Count('u_id' )).filter (uid__gt=1 )
v = models.UserInfo.objects.values('u_id' ).annotate(uid=Count('u_id' ,distinct=True )).filter (uid__gt=1 )
def distinct (self, *field_names )
models.UserInfo.objects.values('nid' ).distinct()
注:只有在PostgreSQL中才能使用distinct进行去重
def order_by (self, *field_names )
models.UserInfo.objects.all ().order_by('-id' ,'age' )
def extra (self, select=None , where=None , params=None , tables=None , order_by=None , select_params=None )
Entry.objects.extra(select={'new_id' : "select col from sometable where othercol > %s" }, select_params=(1 ,))
Entry.objects.extra(where=['headline=%s' ], params=['Lennon' ])
Entry.objects.extra(where=["foo='a' OR bar = 'a'" , "baz = 'a'" ])
Entry.objects.extra(select={'new_id' : "select id from tb where id > %s" }, select_params=(1 ,), order_by=['-nid' ])
def reverse (self ):
models.UserInfo.objects.all ().order_by('-nid' ).reverse()
def defer (self, *fields ):
models.UserInfo.objects.defer('username' ,'id' )
或
models.UserInfo.objects.filter (...).defer('username' ,'id' )
def only (self, *fields ):
models.UserInfo.objects.only('username' ,'id' )
或
models.UserInfo.objects.filter (...).only('username' ,'id' )
def using (self, alias ):
指定使用的数据库,参数为别名(setting中的设置)
def raw (self, raw_query, params=None , translations=None , using=None ):
models.UserInfo.objects.raw('select * from userinfo' )
models.UserInfo.objects.raw('select id as nid from 其他表' )
models.UserInfo.objects.raw('select id as nid from userinfo where nid>%s' , params=[12 ,])
name_map = {'first' : 'first_name' , 'last' : 'last_name' , 'bd' : 'birth_date' , 'pk' : 'id' }
Person.objects.raw('SELECT * FROM some_other_table' , translations=name_map)
models.UserInfo.objects.raw('select * from userinfo' , using="default" )
from django.db import connection, connections
cursor = connection.cursor()
cursor.execute("""SELECT * from auth_user where id = %s""" , [1 ])
row = cursor.fetchone()
def values (self, *fields ):
def values_list (self, *fields, **kwargs ):
def dates (self, field_name, kind, order='ASC' ):
- year : 年-01-01
- month: 年-月-01
- day : 年-月-日
models.DatePlus.objects.dates('ctime' ,'day' ,'DESC' )
def datetimes (self, field_name, kind, order='ASC' , tzinfo=None ):
models.DDD.objects.datetimes('ctime' ,'hour' ,tzinfo=pytz.UTC)
models.DDD.objects.datetimes('ctime' ,'hour' ,tzinfo=pytz.timezone('Asia/Shanghai' ))
"""
pip3 install pytz
import pytz
pytz.all_timezones
pytz.timezone(‘Asia/Shanghai’)
"""
def none (self ):
def aggregate (self, *args, **kwargs ):
from django.db.models import Count, Avg, Max, Min, Sum
result = models.UserInfo.objects.aggregate(k=Count('u_id' , distinct=True ), n=Count('nid' ))
===> {'k' : 3 , 'n' : 4 }
def count (self ):
def get (self, *args, **kwargs ):
def create (self, **kwargs ):
def bulk_create (self, objs, batch_size=None ):
objs = [
models.DDD(name='r11' ),
models.DDD(name='r22' )
]
models.DDD.objects.bulk_create(objs, 10 )
def get_or_create (self, defaults=None , **kwargs ):
obj, created = models.UserInfo.objects.get_or_create(username='root1' , defaults={'email' : '1111111' ,'u_id' : 2 , 't_id' : 2 })
def update_or_create (self, defaults=None , **kwargs ):
obj, created = models.UserInfo.objects.update_or_create(username='root1' , defaults={'email' : '1111111' ,'u_id' : 2 , 't_id' : 1 })
def first (self ):
def last (self ):
def in_bulk (self, id_list=None ):
id_list = [11 ,21 ,31 ]
models.DDD.objects.in_bulk(id_list)
def delete (self ):
def update (self, **kwargs ):
def exists (self ):
其他操作
继续努力,终成大器!
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· dotnet 源代码生成器分析器入门
· 官方的 MCP C# SDK:csharp-sdk
· 一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!
· 一步一步教你部署ktransformers,大内存单显卡用上Deepseek-R1
· 一次Java后端服务间歇性响应慢的问题排查记录