目录
练习代码https://blog.csdn.net/zh__quan/article/details/82155617
1.关系映射
1.一对一映射
1.什么是一对一
A表中的一条记录只能与B表中的一条记录相关联
B表中的一条记录也只能与A表中的一条记录相关联
典型代表:一夫一妻制
在数据库中的实现:
A表:设置 主键
B表:增加一列,引用自A表的主键(外键),并且增加唯一约束
2.语法
在关联的两个类的任何一个类中,增加对另外一个类的引用
属性 = models.OneToOneField(Entry)
ex:
class Wife(models.Model):
name = models.CharFiled(...)
age = models.IntegerField(...)
author = models.OneToOneField(Author)
3.查询
class Wife(models.Model):
name = models.CharFiled(...)
age = models.IntegerField(...)
author = models.OneToOneField(Author)
正向查询:通过 wife 找 author
# 获取id为1的wife的信息
wife = Wife.objects.get(id=1)
# 再获取wife所关联的author
author = wife.author
反向查询:通过 author 找 wife
Django 会通过 OneToOneField() 在关联的实体类中增加一个隐式属性,表示对当前实体的引用
隐式属性名成为 :当前类名的全小写形式
# 先获取id为2的author的信息
author=Author.objects.get(id=2)
# 再获取author对应的wife
wife = author.wife
2.一对多映射
1.什么是一对多
A表中的一条数据可以与B表中的任意多条数据相关联
B表中的一条数据只能与A表中的一条数据相关联
商品类型 与 商品之间的关系
出版社(Publisher) 与 图书(Book)
2.在数据库中的体现
通过外键(Foreign Key) 来实现一对多
在"多"表中增加外键(Foreign Key)对"一"表中的主键进行引用
3.语法
通过外键(Foreign Key)
在"多"实体中,增加:
属性 = models.ForeignKey(Entry)
4.查询
Book(多) 和 Publisher(一)
class Book(models.Model):
... ...
publisher = models.ForeignKey(Publisher)
正向查询 : 通过 Book 查询 Publisher
book=Book.objects.get(id=1)
publisher=book.publisher
反向查询 : 通过 Publisher 查询 Book
Django会通过ForeignKey()向关联的类中增加一个隐式属性 : 当前类_set
3.多对多映射
1.什么是多对多
A表中的一条记录可以与B表中的任意多条记录相匹配
B表中的一条记录可以与A表中的任意多条记录相匹配
2.在数据库中的体现
必须创建第三张表,关联涉及到的两张表的数据
3.语法
在涉及到的两个类的任意一个类中,都可以增加对另外一个类的多对多的引用
entry=models.ManyToManyField(Entry)
ex:
创建书籍和作者之间的多对多的引用
可以在书籍实体中,增加多作者的引用
可以在作者实体中,增加对书籍的引用
以上方式 二选一
class Book(models.Model):
title = models.CharField(xxx)
publicate_date = models.DateField()
author = models.ManyToManyField(Author)
4.查询
class Book(models.Model):
title = models.CharField(xxx)
publicate_date = models.DateField()
author = models.ManyToManyField(Author)
正向查询:通过Book找到对应的所有的Author
# 查询id为1的书籍的信息
book=Book.objects.get(id=1)
# 查询book对应的所有的作者
authors=book.author.all()
通过关联属性查询对应的所有信息
反向查询:通过Author查询所有的Book
Django会通过ManyToManyField()在关联类中增加一个隐式属性
属性名:当前类_set
# 查询id为2的Author的信息
author = Author.objects.get(id=2)
# 查询author对应的所有的书籍
books=author.book_set.all()
练习:
创建 Author 与 Publisher 多对多关系
1.查询 老舍 所签约的所有出版社
2.查询 北京大学出版社 下所有的签约作者