一.配置MySQL
1.安装mysql
2.mysql驱动
使用mysqlclient
pip install mysqlclient
如果上面的命令安装失败,则尝试使用国内豆瓣源安装:
pip install -i https://pypi.douban.com/simple mysglclien
(Linux Ubuntu下需要先安装:apt install libmysqld-dev
再安装:apt install libmysqld-dev)
2,在Django中配置和使用mysql数据库
使用mysql数据库,settings中配置如下
DATABASES ={
Default': {
'ENGINE':'django.db.backends.mysql',
'NAME':'mydb'
'USER':'root',
'PASSWORD':'123456'
'HOST':'127.0.0.1'
'PORT':'3306',
}
}
将mysql数据库的配置到settings.py文件里
学习的时候可以自己新建一个数据库
我在这边创建了一个新的数据库名字为modeldb1在创建的时候注意最后的分号
mysql> create database modeldb1 charset=utf8;
我们尝试执行以下数据迁移
python
生成迁移文件:python manage.py makemigrations
执行迁移文件:python manage.py migrate
再查看一下modlesdb1 已经成功将数据库迁移进去了
这样我们就将mysql配置成功了
二.多模块关联关系
多个模块关联
关联分类
ForeignKey:一对多,将字段定义在多的端中
ManyToManyField:多对多,将字段定义在两端的任意一端中
0neTo0neField:-对一,将字段定义在任意一端中
一对多关系,举例说明(一对一, 多对多类似):
一个学生只能属于一个班级,一个班级可以有多个学生
class Grade(models.Model):
name = models.CharField(max length=20)
class Student(models.Model):
name = models.CharField(max length=20)
grade = models.ForeignKey(Grade)
对象的使用:
正向(在student这边,有grade属性的这一边):
获取学生所在班级(对象):stu.grade
获取学生所在班级的属性:stu.grade.name
反向(在Grade这边):
获取班级的所有学生(获取Manager对象):grade.student_set
获取班级的所有学生(获取QuerySet查询集):grade.student_set.all()
filter(),get()等操作中的使用:
正向(在student这边,有grade属性的这一边):
Student.objects.filter(属性_name='1')
如:Student.objects.filter(grade_name='1')
反向(在Grade这边):
Grade.objects.filter(类名小写_id=7)
如:Grade.objects.filter(student_id=7)
三.modle连表结构
一对多:models.ForeignKey(其他表)
多对多:models.ManyToManyField(其他表)
一对一:models.0neTo0neField(其他表)
应用场景:
一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)
例如:创建用户信息时候,需要选择一个用户头型【普通用户】【金牌用户】【铂金用户】
多对多:在某表中创建一行数据时,有一个可以多选的下拉框。(猫眼App,淘票票,格拉瓦电影)
例如:创建用户信息,需要为用户指定多个爱好
一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了)
例如:有个身份证表,有个person表。每个人只能有一张身份证,一张身份证也只能对应一个人,这就是一对一关系。
一对多关联
一对多关系,即外键
为什么要用一对多。先来看一个例子。有一个用户信息表,其中有个用户类型字段,存储用户的用户类型。如下:
class UserInfo(models.Model):
username = models.CharField(max length=32)
age = models.IntegerField()
user type = models.CharField(max length=10)
不使用外键时用户类型存储在每一行数据中。如使用外键则只需要存储关联表的id即可,能够节省大量的存储空同时使用外键有利于维持数据完整性和一致性。
当然也有缺点,数据库设计变的更复杂了。每次做DELETE 或者UPDATE都必须考虑外键约束
刚才的例子使用外键的情况:单独定义一个用户类型表:
class UserType(models.Model):
caption = models.CharField(max length=32)
class UserInfo(models.Model):
user type = models.ForeignKey('UserType')
username = models.CharField(max length=32)
age = models.IntegerField()
我们约定:
正向操作:ForeignKey在UserInfo表里,如果根据UserInfo去操作就是正向操作。
反向操作:ForeignKey不在UserType里,如果根据UserType去操作就是反向操作。
创建一个一对多的模型
1.增加数据
同样执行一下数据迁移操作
python
生成迁移文件:python manage.py makemigrations
执行迁移文件:python manage.py migrate
可以进入到数据库看一下 在App_user中有一个user_type_id
添加一下路由
执行一次
可以看到数据库里已经成功添加了一些数据
给user表中也添加一些数据
或者用另一种方式添加,也是可以
2.删除数据
在一对多的表结构中删除用户表里面的数据对用户类型表是不受影响的
id=3的那条数据已经被删除
如果删除用户类型里的数据会将对应的用户表里对应的数据删除
python
UserType.objects.filter(id=4).delete()
删除操作可以在定义外键关系的时候,通过on_delete参数来配置删除时做的操作。
on_delete参数主要有以下几个可选值:
models.CASCADE:默认值(Django1.11),表示级联删除,即删除UserType时相关联的User也会被删除。
models.PROTECT 保护模式, 阻止级联删除。
models.SET_NULL 置空模式,设为null,null=True参数必须具备
models.SET_DEFAULT 置默认值 设为默认值,default参数必须具备
models.SET()删除的时候重新动态指向一个实体访问对应元素,可传函数
models.DO_NOTHING 什么也不做。(Django1.11)
注意:修改on_delete参数之后需要重新同步数据库,如果使用
3.修改数据
修改相对来说比较简单,先找到想要修改的数据再进行updata
下一节再进行查询方式的学习