django 单表操作实例详解


Posted in Python onJuly 30, 2019

前面视图层,模板层、路由层都写了大概,项目肯定是会和数据库打交道,那就讲讲orm的单表查询吧,直接写过一点点,不太全面。

1、项目刚创建好,我们需要在settings里配置一下(用mysql数据库),配置好了,再去app文件夹里的__init__配置下,其实在
哪个__init__配置都一样,项目启动时,首先是执行__init__文件。下面直接贴代码了。

setting文件里:

DATABASES = {
    'default': {
      'ENGINE': 'django.db.backends.mysql',
      'HOST': '127.0.0.1',
      'PORT': 3306,
      'USER': 'root',
      'PASSWORD': '',
      'NAME': 'zhuyu',
      }
    }

__init__文件里:

import pymysql
    pymysql.install_as_MySQLdb()
 
    #还是写写为什么吧,前面也写过,再写一次。
    #首先django里mysql用的是MySQLdb,但是python3.x现在不支持MySQLdb了,所引在项目启动时,将MySQLdb转成pymysql
    #你是python2.x的可以不用写。

2、上面的配置配置好了,你就可以在models.py写orm了,我以Student为例

class Student(model.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.CharField(max_length=32)
    balance = models.CharField(max_length=32)

3、数据库迁移命令我就不写了,对数据库操作无非就是增删改查

增加:

方式一:

ret = models.Student.object.create(name='zhuyu',age=21,balance='5000')
    #这里的ret是学生对象

方式二:

zhanghao = models.Student(name='zhanghao',age=22,balance='4000)
    zhanghao.save()
    #先实例一个学生对象,再调用学生对象的方法,我们没写,调用的肯定是它基类的方法。

修改:

方式一:

ret = models.Student.object.filter(name='zhuyu').update(balance='9999)
    #返回值ret是对数据库影响的行数,
    #a = models.Student.object.filter(name='zhuyu'),a是一个queryset对象,所以update是它的一个方法

方式二:

那么我Student对象有没有update方法呢?

ret = models.Student.object.filter(name='zhuyu').first().update(balance='9999')

答案是会报错的!!!!!,记住对象是没有update方法的!!!!!

那我对象怎么修改呢?

ret = models.Student.object.filter(name='zhuyu').first()
    ret.balance = '8888'
    ret.save()
    #很简单,拿到修改对象,该属性值,调用save()方法就行

删除:

ret = models.Student.object.filter(name='zhuyu')
    ret.delete()
    #这里的ret是queryset对象,调用的是它的delete方法

继续上面的方法,对象有没有delete方法呢?

ret = models.Student.object.filter(name='zhuyu').first()
    ret.delete()
    #ret就是学生对象了,结果显示能成功删除!所以对象是有delete方法

增删改上面就写完了,下面主要写写查询吧。
1、all 查询所有的结果:

ret = models.Student.object.all()
    #ret是queryset对象

2、filter 筛选符合条件的:

ret = models.Student.object.filter(name='zhuyu')
    # ret为queryset对象,姑且就是一个列表吧,装着一个一个对象

3、first 查询符合条件的第一个对象

ret = models.Student.object.filter(balance='5000').first()
    # ret没啥好说的,一个对象,上面写了queryset对象姑且为列表,那么就可以索引取值了,
    # 我们再看first()方法,它是取了queryset对象的索引0最为返回值,那么我也可以取
    ret = models.Student.object.filter(balance='5000')[0]
    # 注意:是可以通过索引取值,但是索引不能为负数!!

4、last 查询符合条件的最后一个对象

ret = models.Student.object.filter(balance='2000').last()
    # ret是学生对象,前面不是说queryset对象是不能取负数嘛,那最后一个用-1
    # 肯定会报错,那么last怎么实现的呢?
    # reverse查询的结果进行反转,看下面这句代码
    ret = models.Student.object.filter(balance='2000').reverse().first()
    # last()原理就是这样实现的

5、exclude 筛选出不符合条件的

ret = models.Student.object.exclude(age=20)
    # ret 为queryset对象
    # exclude和filter一样,可以跟多个条件,用逗号分开
    ret = models.Student.object.exclude(age=20,name='zhuyu')
    # 查询出不是name为朱宇,并且年龄为20的所有学生,相当于and

6、count 查看queryset对象里的个数

ret = models.Student.object.all()
    # ret为一个整型

7、order_by 排序

# 以学生年龄从小到大排序
    ret = models.Student.object.order_by('age')
    # ret为queryset对象
    # 以学生年龄从大到小排序
    ret = models.Student.object.order_by('-age')
    # 我认为实现方法为,先取出一个条件(也就是字符串),取索引0,看是否为'-',是的话
    # 取索引1到最后为条件,再转换sql语句时,ASC改为DESC,排序方式改变。

8、reverse 结果取反

ret = models.Student.object.order_by('age').reverse()
    # ret为queryset对象,年龄从大到小排序。

9、exists 判断queryset对象里是否有数据嘛

它的返回值就是True False

10、values和values_list

values:它是queryset对象的方法,它的返回值也是queryset对象,里面是一个大列表装着一个一个字典

字典里的key就是values里的值

values_list:queryset对象的方法,它的返回值也是queryset对象,里面是一个大列表一个一个元组,元组的值就是values_list里所取到的值。

11、distinct 去重,不用多说了,queryset对象的方法。

12、get 也是取出符合条件的一个,但是那个条件必须是唯一的,必须存在的。

假如:取出叫zhuyu的学生,叫zhuyu的学生不止一个,那么你用get就会报错取出叫dsb的学生,如果没有,你用get就会出错。

上面就是一些单表查询的方法,发现没有,为何每个返回值,我都要写什么类型,大多数就是queryset类型,所以只要前面
是queryset对象,我们都可以用到它的方法,比如:取出学生balance为5000,且按照年龄从小到大排序。

下面写写基于双下划线的模糊查询

# 查询学生年龄为12,16,13的学生
  models.Student.object.filter(age__in=[13,13,16])
 
  # 查询学生年龄大于12的学生
  models.Student.object.filter(age__gt=12)
 
  # 查询学生年龄小于12的学生
  models.Student.object.filter(age__lt=12)
 
  # 查询学生年龄大于等于12的学生
  models.Student.object.filter(age__gte=12)
 
  # 查询学生年龄小于等于12的学生
  models.Student.object.filter(age__lte=12)
 
  # 查询学生名字中有宇的学生
  models.Student.object.filter(name__contains='宇')
 
  # 查询学生名字以朱开头的学生
  models.Student.object.filter(name__startswith='朱')

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python同时给两个收件人发送邮件的方法
Apr 30 Python
详解字典树Trie结构及其Python代码实现
Jun 03 Python
基于Python的关键字监控及告警
Jul 06 Python
Python对列表去重的多种方法(四种方法)
Dec 05 Python
pandas DataFrame 交集并集补集的实现
Jun 24 Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
Aug 06 Python
使用python实现离散时间傅里叶变换的方法
Sep 02 Python
使用python turtle画高达
Jan 19 Python
在PyCharm中遇到pip安装 失败问题及解决方案(pip失效时的解决方案)
Mar 10 Python
django ListView的使用 ListView中获取url中的参数值方式
Mar 27 Python
python 制作简单的音乐播放器
Nov 25 Python
教你如何使用Python Tkinter库制作记事本
Jun 10 Python
Apache部署Django项目图文详解
Jul 30 #Python
Python 使用list和tuple+条件判断详解
Jul 30 #Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
Jul 30 #Python
Python实现二叉搜索树BST的方法示例
Jul 30 #Python
django 基于中间件实现限制ip频繁访问过程详解
Jul 30 #Python
python3安装crypto出错及解决方法
Jul 30 #Python
Django框架组成结构、基本概念与文件功能分析
Jul 30 #Python
You might like
php实现的Captcha验证码类实例
2014/09/22 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
2017/06/19 PHP
从零学JSON之JSON数据结构
2014/05/19 Javascript
EasyUI在表单提交之前进行验证的实例代码
2016/06/24 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
2016/08/08 Javascript
jQuery实现简洁的轮播图效果实例
2016/09/07 Javascript
js控制一个按钮是否可点击(可使用)disabled的实例
2017/02/14 Javascript
nodejs入门教程六:express模块用法示例
2017/04/24 NodeJs
浅谈nodejs中的类定义和继承的套路
2017/07/26 NodeJs
js数字滑动时钟的简单实现(示例讲解)
2017/08/14 Javascript
详解js location.href和window.open的几种用法和区别
2019/12/02 Javascript
在vue-cli3.0 中使用预处理器 (Sass/Less/Stylus) 配置全局变量操作
2020/08/10 Javascript
vue移动端下拉刷新和上滑加载
2020/10/27 Javascript
[05:17]DOTA2誓师:今天我们在这里 明天TI4等我!
2014/03/26 DOTA
Python生成随机MAC地址
2015/03/10 Python
python实现清屏的方法
2015/04/30 Python
Python实现Pig Latin小游戏实例代码
2018/02/02 Python
pycharm远程开发项目的实现步骤
2019/01/20 Python
Django REST framework内置路由用法
2019/07/26 Python
openCV提取图像中的矩形区域
2020/07/21 Python
详解如何在pyqt中通过OpenCV实现对窗口的透视变换
2020/09/20 Python
Django ModelForm组件原理及用法详解
2020/10/12 Python
纯css3实现走马灯效果
2014/12/26 HTML / CSS
wordpress添加Html5的表单验证required方法小结
2020/08/18 HTML / CSS
WoolOvers爱尔兰:羊绒、羊毛和棉针织品
2017/01/04 全球购物
亚瑟士美国官网:ASICS美国
2017/02/01 全球购物
N:Philanthropy官网:美国洛杉矶基础款服装
2020/06/09 全球购物
美国健康和保健平台:healtop
2020/07/02 全球购物
新加坡第一的杂货零售商:NTUC FairPrice
2020/12/05 全球购物
Servlet面试题库
2015/07/18 面试题
广告设计应届生求职信
2014/03/01 职场文书
红色旅游心得体会
2014/09/03 职场文书
2014物价局民主生活会对照检查材料思想汇报
2014/09/24 职场文书
《普罗米修斯》教学反思
2016/02/22 职场文书
教你利用Selenium+python自动化来解决pip使用异常
2021/05/20 Python
Python中rapidjson参数校验实现
2021/07/25 Python