首页 > 数据库 >Django框架:6、模型层之ORM查询关键字、SQL语句转换

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

时间:2022-12-14 22:33:46浏览次数:53  
标签:name objects models res Django filter ORM User 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语句

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)

标签:name,objects,models,res,Django,filter,ORM,User,SQL
From: https://www.cnblogs.com/kangssssh/p/16983847.html

相关文章

  • Django之模型层
    模型层之前期准备自带的sqlite3数据库对时间字段不敏感,有时候会展示错乱,所以我们习惯切换成常见的数据库比如MySQL,djangoorm并不会自动帮你创建库,所以需要提前准备好。D......
  • django之模型层
    目录模型层模型层前期准备模型层之ORM常见关键字模型层模型层前期准备使用djangoORM要注意​ 1、django自带的sqlite3数据可对时间字段不敏感,有时候会展示错乱,所以我......
  • django 5 模板层补充与模型层基础
    今日内容详细目录今日内容详细模板层之标签自定义过滤器、标签及inclusion_tag(了解)模板的继承与导入模型层模型层之前期准备ORM常用关键字模板层之标签{%if条件1(可......
  • 模块层 模块的导入以及继承 ORM常用关键字
    今日内容详细模板层之标签#支持使用if判断for循环和while循环if判断 {%if条件1%} 条件1满足执行的代码 {%elif条件2%} 条件2满足执行的代码{......
  • python之路49 模板层标签 自定义过滤器 模板继承、模型层准备、ORM部分操作
    模板层之标签{%if条件1(可以自己写也可以是用传递过来的数据)%}<p>周三了周三了</p>{%elif条件2(可以自己写也可以用传递过来的数据)%}<p>百日......
  • django5
    模板层之标签{%if条件1(可以自己写也可以用传递过来的数据)%}<p>今天又是周三了</p>{%elif条件2(可以自己写也可以用传递过来的数据)%}<p>百日......
  • 模板层之标签、自定义过滤器、标签及inclusion_tag(了解)、模板的继承与导入、模型层
    模板层之标签(类似于python流程控制)在django模板语法中写标签的时候,只需要写关键字然后tab键就会自动补全。1.if判断{%if条件%}#条件一般是模板语法传过来的数......
  • django模板层与模型层
    内容导航模板层之标签自定义过滤器、标签及inclusion_tag(了解)母版的继承与导入模型层之ORM常见关键字内容详细模板层之标签{%if条件1(可以自己写也可以用......
  • SQL Server一个字符串根据某指定字符 拆分多行显示
    逻辑:先将该字段值统一替换为符号(我用的符号是“я”)分割,再将符号分割替换转为XML数据类型,再利用xml转为多个行 拆分前selectptypeid,serial fromsalebill  ......
  • django 06 模型层
    模型层使用准备#1.django自带的sqllite3对时间字段不敏感,所以使用mysql会更常见#2.单独测试django某个功能层"""django默认是不可以单独测试py文件的"""......