Django框架:6、模型层之ORM查询关键字、SQL语句转换
Django框架之模型层
一、模型层前期准备
介绍
在django框架中,模型层是直接和数据库进行操作的,所有数据的增删改查都由模型层来完成
django框架自带的sqlite3数据库对时间不敏感,有时候还会出现错乱的问题,一般都是在测试阶段使用
在这里我们将数据库切换成Mysql数据库,orm并不会帮助我们创建库,所以需要提前准备好
如何在Django中测试某个功能
django默认不允许单独测试某个py文件,如果想要测试某个py文件(主要针对models.py)
方法一:
pycharm提供python consol
该方法适合零时测试,类似于终端,不能长久有保存代码
方法二:
自己搭建(自带的test或者自己创建py文件)
1、拷贝manage.py中的前四行代码
2、自己在手动编写两行
import django
django.setup()
orm底层原理
orm的底层还是sql语句,只是orm将sql封装成了方法
如果我们手上的代码是QuerySet对象,那么我们就可以通过点query的方式查看SQL语句
如果想要查看所有orm底层的SQL语句,可以在settings文件中添加下列代码
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
二、ORM常用查询关键字
1.create()
创建数据并直接获取当前创建的数据对象
res = models.User.objects.create(name='阿兵', age=28)
res = models.User.objects.create(name='oscar', age=18)
res = models.User.objects.create(name='jerry', age=38)
res = models.User.objects.create(name='jack', age=88)
print(res)
2.filter()
根据条件筛选数据,结果是QuerySet [数据对象1,数据对象2]
res = models.User.objects.filter()
res = models.User.objects.filter(name='jason')
res = models.User.objects.filter(name='jason', age=19)
# 括号内支持多个条件但是默认是and关系
3.first()、last()
QuerySet支持索引取值但是只支持正数 并且orm不建议你使用索引
res = models.User.objects.filter()[1]
res = models.User.objects.filter(pk=100)[0] # 数据不存在索引取值会报错
res = models.User.objects.filter(pk=100).first() # 数据不存在不会报错而是返回None
res = models.User.objects.filter().last() # 数据不存在不会报错而是返回None
4.update()
更新数据(批量更新)
models.User.objects.filter().update() # 批量更新
models.User.objects.filter(id=1).update() # 单个更新
5.delete()
删除数据(批量删除)
models.User.objects.filter().delete() # 批量删除
models.User.objects.filter(id=1).delete() # 单个删除
6.all()
查询所有数据,结果是QuerySet [数据对象1,数据对象2]
res = models.User.objects.all()
7.values()
根据指定字段获取数据,结果是QuerySet [{},{},{},{}]
res = models.User.objects.all().values('name')
res = models.User.objects.filter().values()
res = models.User.objects.values()
8.values_list()
根据指定字段获取数据,结果是QuerySet [(),(),(),()]
res = models.User.objects.all().values_list('name','age')
9.distinct()
去重 数据一定要一模一样才可以 如果有主键肯定不行
res = models.User.objects.values('name','age').distinct()
10.order_by()
根据指定条件排序 默认是升序 字段前面加负号就是降序
res = models.User.objects.all().order_by('age')
print(res)
11.get()
根据条件筛选数据并直接获取到数据对象 一旦条件不存在会直接报错 不建议使用
res = models.User.objects.get(pk=1)
print(res)
res = models.User.objects.get(pk=100, name='jason')
print(res)
12.exclude()
取反操作
res = models.User.objects.exclude(pk=1)
print(res)
13.reverse()
颠倒顺序(被操作的对象必须是已经排过序的才可以)
res = models.User.objects.all()
res = models.User.objects.all().order_by('age')
res1 = models.User.objects.all().order_by('age').reverse()
print(res, res1)
14.count()
统计结果集中数据的个数
res = models.User.objects.all().count()
print(res)
15.exists()
判断结果集中是否含有数据 如果有则返回True 没有则返回False
res = models.User.objects.all().exists()
print(res)
res1 = models.User.objects.filter(pk=100).exists()
print(res1)