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