DjangoORM–多表实例:Django模型Model的定义+模型间关
Django 对各种数据库提供了很好的⽀持,包括:PostgreSQL、MySQL、SQLite、Oracle。
Django 为这些数据库提供了统⼀的调⽤API。 我们可以根据⾃⼰业务需求选择不同的数据库。
MySQL 是 Web 应⽤中最常⽤的数据库。
Django 模型使⽤⾃带的 ORM。
对象关系映射(Object Relational Mapping,简称 ORM )⽤于实现⾯向对象编程语⾔⾥不同类型系统的数据之间的转换。
ORM 在业务逻辑层和数据库层之间充当了桥梁的作⽤。
ORM 是通过使⽤描述对象和数据库之间的映射的元数据,将程序中的对象⾃动持久化到数据库中。
作⽤:根据对象的类型⽣成表结构,将对象、列表的操作转换为sql语句,将sql语句查询到的结果转换为对象、列表,极⼤的减轻了开发⼈员的⼯作量,不需要⾯对因数据库的变更⽽修改代码。
ORM 解析过程:
1、ORM 会将 Python 代码转成为 SQL 语句。
2、SQL 语句通过 pymysql 传送到数据库服务端。
3、在数据库中执⾏ SQL 语句并将结果返回。
ORM 对应关系表:
由于django的查询⽅式,不允许使⽤连续的下划线。
定义属性时,需要字段类型,字段类型被定义在```dels.fields```⽬录下,为了⽅便使⽤,被导⼊到
```dels```中,定义模型时先导⼊```from django.db import models```,通过models.Field创建字段类型的对象,赋值给属性。
注意:对于重要数据都做逻辑删除,不做物理删除,实现⽅法是定义isDelete属性,类型为BooleanField,默认值为False
模型间关系:⼀对⼀关系 : OneToOneField、⼀对多关系 : ForeignKey、
多对多关系 : ManyToManyField
关联管理器(对象调⽤):
前提:
多对多(双向均有关联管理器)
⼀对多(只有多的那个类的对象有关联管理器,即反向才有)
语法格式:
正向:属性名
反向:⼩写表名_set
⼀对多关系 : ForeignKey
class Student(models.Model):
xor逻辑
name = models.CharField()
grade = ForeignKey(Grade)
class Grade(models.Model):
gname = models.CharField()
stu = Student()
grade = Grade()
grade.student_set # 反向查询,通过班级名查询学⽣
多对多关系 : ManyToManyField
class Student(models.Model):
name = models.CharField()
course = ManyToManyField(Course)
class Curse(models.Model):
cname = models.CharField()
stu = Student()
course = Course()
course.student_set # 反向 查询选修课程的学⽣名
表与表之间的关系可分为以下三种:
⼀对⼀: ⼀个⼈对应⼀个⾝份证号码,数据字段设置 unique。
⼀对多: ⼀个家庭有多个⼈,⼀般通过外键来实现。
多对多: ⼀个学⽣有多门课程,⼀个课程有很多学⽣,⼀般通过第三个表来实现关联。
创建模型:
接下来我们来看下多表多实例:哈希表中出现哈希冲突是指
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
pub_date = models.DateField()
publish = models.ForeignKey("Publish", on_delete=models.CASCADE)
authors = models.ManyToManyField("Author")
class Publish(models.Model):
name = models.CharField(max_length=32)
city = models.CharField(max_length=64)
email = models.EmailField()
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.SmallIntegerField()
au_detail = models.OneToOneField("AuthorDetail", on_delete=models.CASCADE)
class AuthorDetail(models.Model):
gender_choices = (
(0, "⼥"),
(1, "男"),
(2, "保密"),
)
gender = models.SmallIntegerField(choices=gender_choices)
tel = models.CharField(max_length=32)
mysql安装教程菜鸟课程addr = models.CharField(max_length=64)
birthday = models.DateField()
说明:
1、EmailField 数据类型是邮箱格式,底层继承 CharField,进⾏了封装,相当于 MySQL 中的 varchar。
2、Django1.1 版本不需要联级删除:on_delete=models.CASCADE,Django2.2 需要。
3、⼀般不需要设置联级更新.
4、外键在⼀对多的多中设置:models.ForeignKey("关联类名", on_delete=models.CASCADE)。
5、OneToOneField = ForeignKey(...,unique=True)设置⼀对⼀。
6、若有模型类存在外键,创建数据时,要先创建外键关联的模型类的数据,不然创建包含外键的模型类的数据时,外键的关联模型类的数据会不到。
表结构:
书籍表 Book:title 、 price 、 pub_date 、 publish(外键,多对⼀) 、 authors(多对多)
出版社表 Publish:name 、 city 、 email
作者表 Author:name 、 age 、 au_detail(⼀对⼀)
作者详情表 AuthorDetail:gender 、 tel 、 addr 、 birthday
以下是表格关联说明:
插⼊数据:
在 MySQL 中执⾏以下 SQL 插⼊操作:
insert into app01_publish(name,city,email) values ("华⼭出版社", "华⼭", "hs@163"), ("明教出版社", "⿊⽊崖",
"mj@163")
# 先插⼊ authordetail 表中多数据
insert into app01_authordetail(gender,tel,addr,birthday) values (1,134********,"华⼭","1994-5-23"), (1,139********,"⿊⽊崖","1961-8-13"), (0,138********,"⿊⽊崖","1996-5-20")
# 再将数据插⼊ author,这样 author 才能到 authordetail
insert into app01_author(name,age,au_detail_id) values ("令狐冲",25,1), ("任我⾏",58,2), ("任盈盈",23,3)
ORM - 添加数据
⼀对多(外键 ForeignKey)
⽅式⼀: 传对象的形式,返回值的数据类型是对象,书籍对象。
步骤:
a. 获取出版社对象
b. 给书籍的出版社属性 pulish 传出版社对象
def add_book(request):
#  获取出版社对象
pub_obj = models.Publish.objects.filter(pk=1).first()
#  给书籍的出版社属性publish传出版社对象
book = models.ate(title="菜鸟教程", price=200, pub_date="2010-10-10", publish=pub_obj)    print(book, type(book))
⽅式⼆: 传对象 id 的形式(由于传过来的数据⼀般是 id,所以传对象 id 是常⽤的)。
⼀对多中,设置外键属性的类(多的表)中,MySQL 中显⽰的字段名是:外键属性名_id。
返回值的数据类型是对象,书籍对象。
步骤:
a. 获取出版社对象的 id
b. 给书籍的关联出版社字段 pulish_id 传出版社对象的 id
def add_book(request):
#  获取出版社对象
pub_obj = models.Publish.objects.filter(pk=1).first()
#  获取出版社对象的id
pk = pub_obj.pk
openstack最新稳定版#  给书籍的关联出版社字段 publish_id 传出版社对象的id
book = models.ate(title="冲灵剑法", price=100, pub_date="2004-04-04", publish_id=pk)    print(book, type(book))
多对多(ManyToManyField):在第三张关系表中新增数据
⽅式⼀: 传对象形式,⽆返回值。
步骤:
a. 获取作者对象
b. 获取书籍对象
c. 给书籍对象的 authors 属性⽤ add ⽅法传作者对象
def add_book(request):
string类返回指定字符串
#  获取作者对象
chong = models.Author.objects.filter(name="令狐冲").first()
ying = models.Author.objects.filter(name="任盈盈").first()
matlab axis函数
#  获取书籍对象
book = models.Book.objects.filter(title="菜鸟教程").first()  # 返回查询集中的第⼀个对象
#  给书籍对象的 authors 属性⽤ add ⽅法传作者对象
book.authors.add(chong, ying)
关联管理器(对象调⽤)
前提:
多对多(双向均有关联管理器)
⼀对多(只有多的那个类的对象有关联管理器,即反向才有)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。