zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Django框架:6、模型层之ORM查询关键字、SQL语句转换

2023-02-18 16:26:59 时间

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语句

img

​ 如果想要查看所有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)