您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Django学习笔记〇三——数据库ORM的使用(带修改)

bubuko 2022/1/25 20:09:44 其他 字数 10799 阅读 1122 来源 http://www.bubuko.com/infolist-5-1.html

Django框架基本上都是要和数据库结合使用的,我在以前讲过SQLAlchemy框架的使用,Django支持的不是SQLAlchemy,但是也内嵌了ORM框架,可以不需要直接面对数据库编程,而可以通过定义模型类,通过面向对象的方式来实现数据表的增删改查。 点击查看官方的文档 创建表 ORM和DB的对 ...

Django框架基本上都是要和数据库结合使用的,我在以前讲过SQLAlchemy框架的使用,Django支持的不是SQLAlchemy,但是也内嵌了ORM框架,可以不需要直接面对数据库编程,而可以通过定义模型类,通过面向对象的方式来实现数据表的增删改查。

点击查看官方的文档

创建表

ORM和DB的对应关系

通过下面的图回顾一下ORM和DB的对应关系

技术分享图片

创建数据库

和SQLAlchemy差不多,Django的数据库必须手动创建database。

我们先创建一个名字叫DjangoDB的数据库。

mysql> create database djangoDB charset=utf8;

 我们以前讲过ORM的面向对象的思路——ORM和DB的对应关系

创建类——表

那么这个类要放在哪里呢?还记得在上一章讲APP的时候,APP的那个文件夹里有个models的文件么?没错,就是写在这里。

class User(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(null=False,max_length=20)
    age = models.IntegerField()
技术分享图片
AutoField:自动增长的IntegerField, 不指定时Django会自动创建属性名为id的自动增长属性
BooleanField:布尔字段,值为True或False
NullBooleanField:支持Null、True、False三种值
CharField(max_length=20):字符串
参数max_length表示最大字符个数
TextFiled:大文本字段,一般超过4000个字符时使用
IntegerField:整数
DecimalField(max_digits=None, decimal_places=None):可以指定精度的十进制浮点数
参数max_digits表示总位数
参数decimal_places表示小数位数
FloatField():浮点数 
DateField[auto_now=False, auto_now_add=False]):日期
参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false
参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false
参数auto_now_add和auto_now是相互排斥的,组合将会发生错误
TimeField:参数和DateField一样
DateTimeField:日期时间,参数同DateField
FileField:上传文件字段,以二进制的形式
ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片
字段类型
技术分享图片
null:如果为True,表示允许为空,默认值是False
blank:如果为True,则该字段允许为空白,默认值是False    
对比:null是数据库范畴的概念,blank是表单验证范畴的
db_column:字段的名称,如果未指定,则使用属性的名称(只限于数据库表中的名字,操作数据库还是类属性的名字)
db_index:若值为True, 则在表中会为此字段创建索引,默认值是False(为了优化查询速度 )
default:默认值,这可以是值或可调用对象。如果可调用,则每次创建新对象时都会调用它。
primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用
unique:如果为True, 这个字段在表中必须有唯一值,这个值不能重复,默认值是False
字段选项

我们这个类定义了一个具有三个字段的表——id,name和age。注意类的继承,千万不要错了。

数据库配置

下面要对Django进行数据库的配置,,由于我们用的是MySQL ,就要在setting.py文件中对数据库的部分进行配置,配置前的胆码如下图

技术分享图片

修改完成应该是这样的

DATABASES = {
    default: {
        ENGINE: django.db.backends.mysql,   #指定数据库——MySQL
        HOST:127.0.0.1,                     #连接IP
        PORT:3306,                            #端口:3306
        NAME:test,                          #database名称
        USER:root,                          #用户名
        PASSWORD:‘‘                           #密码
    }
}

有个问题,Django默认的MySQL的API好像是MySQLdb,但是python3已经不支持了,我们要使用pymysql来替代他,(直接进行表的创建的时候会发现建议我们使用mysqlclient,可以用pip直接安装)

 技术分享图片

在网上查了查,据说mysqlclient的稳定性不如pymysql,但是效率好像高一些。所以我们还是使用pymysql。要在项目的__init__.py中指明我们所用的API(注意是项目的py文件不是APP的)

#__init__.py文件
import pymysql
pymysql.install_as_MySQLdb()    #告诉Django用pymysql来替代默认的MySQLdb

生成table

下面就要我们通过mange.py来创建表

python manage.py makemigrations
python manage.py migrate

第一条语句是用来对类进行比较,看看是否有变化,第二条语句是把对应的变化体现在MySQL的表里。执行的效果

技术分享图片      

技术分享图片

第二条指令执行完毕,可以在MySQL里看看创建的表

 技术分享图片

 注意第一个table的名字,就是依据我们的User那个表创建的。我们还可以看一下这个表的结构

 技术分享图片

 是不是跟我们定义的类是一样的!

表的删除和修改

表的修改 

如果我们想对表进行修改,或删除,只需要对前面创建的类进行修改后重新执行下面两段代码就可以了

python manage.py makemigrations
python manage.py migrate

我在类最后添加了一个字段,第一个命令后会问是否执行

技术分享图片

 

 我们选择1以后会弹出一个python的解释器,按照要求输入

>>> timezone.now

这里有个深坑:

在添加字段的时候会报错:

django.db.utils.InternalError: (1067, "Invalid default value for‘name1’)

上面name1是新建的字段名,据说是字符集存在问题。

 

就可以了。不过在此期间出现了一堆错误,后来不知道怎么跑了一遍就有好了。

表的删除

如果想删除这个表,只需要把表对应的类注释掉(注意注释掉就可以了,不用删除。)

数据操作

 数据的操作我们还是从增删改查四个方面来说

数据添加

数据添加要先实例化一个对象

models.User.objects.create(name="张三")

可以直接用类的objects.create的方式

数据查询

基本查询

  1. get()——查询单一结果,如果不存在会抛出模型类DoesNotExist异常
  2. all()——查询多个结果
  3. count()——查询结果数量。

过滤查询

过滤查询可以实现SQL语句中的where的功能,包括下面的方法

  1. filter()——过滤出多个结果
  2. exclude()——排除掉符合条件剩下的结果
  3. get()——过滤单一结果

过滤查询的条件也是很多种的

 

Django学习笔记〇三——数据库ORM的使用(带修改)

原文:https://www.cnblogs.com/yinsedeyinse/p/12368859.html


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶