Django框架学习 — 7.3模型详解 -- 模型关系

django设计数据库知识,下面介绍一下数据库实体之间的关系

数据库实体间有3种对应关系:一对一,一对多,多对多。

一对一关系: 一个学生对应一个学生档案编号
一对多关系: 一个学生只属于一个班级,但一个班级有多名学生
在这里插入图片描述
在学生表中添加班级号字段作为外键,与班级表的主键关联

多对多关系: 一个学生可以选择多门课,一门课也有多名学生选择。
在这里插入图片描述
在多对多关系中,通过添加字段无法解决问题,需要创建额外的关系表来连接相关数据表
删除数据时,要先删除关系表中的记录,再删除主表中的记录
在这里插入图片描述

模型类中处理3种关系

一对一:使用OneToOneField()函数,将字段定义在任意模型类中。
一对多:使用ForeignKey()函数,将字段定义在多的模型类中
多对多:使用ManyToManyField()函数,将字段定义在任意模型类中
可以维护递归的关联关系,使用self指定
一对多关系: 一对一关系可以看作一对多的特例

修改models.py文件中的PersonInfo类,添加hbook属性
ORM会在app_personinfo表中增加hbook_id字段作为外键,并关联到app_bookinfo表的id主键

说明:如果生成迁移文件报错,将migrations目录中除init之外的文件删除

class PersonInfo(models.Model):
    ...
    hbook = models.ForeignKey('BookInfo', on_delete=models.CASCADE)

在这里插入图片描述
在这里插入图片描述
增加测试数据

INSERT INTO app_personinfo(pname, pgender, pcomment, isDelete, hbook_id) VALUES
('曹操',1,'字孟德',0,1),
('刘备',1,'字玄德',0,1),
('诸葛亮',1,'字孔明',0,1),
('孙权',1,'字仲谋',0,1),
('贾宝玉',1,'荣国府公子',0,2),
('林黛玉',0,'金陵十二钗之冠',0,2);

在这里插入图片描述
多对多关系:

在models.py文件中增加新闻类型类和新闻类
一个新闻类型下可以用多条新闻,一条新闻可以属于多种新闻类型

新闻类型
class TypeInfo(models.Model):
    tname = models.CharField(max_length=20)  # 新闻类别

新闻
class NewsInfo(models.Model):
    ntitle = models.CharField(max_length=60)  # 新闻标题
    ncontent = models.TextField()  # 新闻内容
    npub_date = models.DateTimeField(auto_now_add=True)  # 新闻发布时间

    # 通过ManyToManyField建立TypeInfo类和NewsInfo类之间多对多的关系
    typeinfo= models.ManyToManyField('TypeInfo')

执行数据迁移后,自动创建3张表:

app_typeinfo:新闻类型表
app_newsinfo:新闻表
app_newsinfo_typeinfo:关系表
说明:如果要指定关系表的名字,可以使用througt参数
在这里插入图片描述
添加测试数据

新闻类型
INSERT INTO app_typeinfo(tname) VALUES
('科技'),
('军事'),
('国际')

新闻
INSERT INTO app_newsinfo(ntitle, ncontent, npub_date) VALUES
('互联网科技','马云已退出阿里旗下5家公司:官方称没这个打算','2018-7-24'),
('数码产品','苹果官方科普来了:全面认识Apple ID','2018-6-23')

关系表
INSERT INTO app_newsinfo_ntype(newsinfo_id, typeinfo_id) VALUES
(1,2),
(2,1)

实例演示: 使用SQL语句,查询所有新闻标题、内容及其类型

SELECT n.ntitle, n.ncontent, t.tname
FROM app_newsinfo n, app_typeinfo t, app_newsinfo_ntype nt
WHERE n.id = nt.newsinfo_id AND t.id = nt.typeinfo_id

在这里插入图片描述

发布了15 篇原创文章 · 获赞 0 · 访问量 150

猜你喜欢

转载自blog.csdn.net/zyh8619990307/article/details/104303620