Django模型进阶

一.配置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

下一节再进行查询方式的学习

相关推荐
我叫czc几秒前
【Python高级353】python实现多线程版本的TCP服务器
服务器·python·tcp/ip
Q_19284999062 分钟前
基于Spring Boot的个人健康管理系统
java·spring boot·后端
liutaiyi83 分钟前
Redis可视化工具 RDM mac安装使用
redis·后端·macos
爱数学的程序猿5 分钟前
Python入门:6.深入解析Python中的序列
android·服务器·python
Q_192849990610 分钟前
基于Springcloud的智能社区服务系统
后端·spring·spring cloud
xiaocaibao77712 分钟前
Java语言的网络编程
开发语言·后端·golang
comli_cn32 分钟前
使用清华源安装python包
开发语言·python
赵谨言42 分钟前
基于python 微信小程序的医院就诊小程序
经验分享·python·毕业设计
1.01^10001 小时前
[1111].集成开发工具Pycharm安装与使用
python·pycharm
HEX9CF1 小时前
【Django】测试带有 CSRF 验证的 POST 表单 API 报错:Forbidden (CSRF cookie not set.)
python·django·csrf