对Django外键关系的描述


Posted in Python onJuly 26, 2019

注:本文需要你有一定的数据库知识,本文的数据库语法使用mysql书写

Django中,跟外键有关的关系有三种,下面来一一介绍。

OneToManyField

这种最好理解,说白了就是最普通的外键,看看下面两个模型:

class GoodsType(models.Model):
  name = models.CharField(max_length=50)

class GoodsMessage(models.Model):
  Title = models.CharField(max_length='100') # 商品标题
  Category = models.ManyToManyField(GoodsType) # 商品标签

分析一下:

这里Django会在数据库中创两张表:

create table GoodsType(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
)

create table GoodsMessage(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `Title` varchar(50) NOT NULL,
  `Category_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (`Category_id`) REFERENCES `SchoolBuy_goodstype` (`id`)
)

这样的结果就是一个商品会对应一个类别,即类别是商品的外键。

OneToOneField

这种关系和OneToMany类似,是一种有约束的外键,看看下面两个模型:

class GoodsType(models.Model):
  name = models.CharField(max_length=50)

class GoodsMessage(models.Model):
  Title = models.CharField(max_length='100') # 商品标题
  Category = models.OneToManyField(GoodsType) # 商品标签 (变为一对一关系)

他们会使得数据库创建什么表呢?

create table GoodsType(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
)

create table GoodsMessage(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `Title` varchar(50) NOT NULL,
  `Category_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (`Category_id`) REFERENCES `SchoolBuy_goodstype` (`id`),
  UNIQUE KEY `SchoolBuy_goodsmessage_Category_id_4dd415fc1e19cf24_uniq` (`Category_id`) # 新增
)

那么这里已经很明显了,在这两个模型里,每个商品有一个商品类型,并且每个商品类型只属于一个商品(用了UNIQUE约束),即如果我A商品的类型是电脑,那么其他商品的类型都不能定义为电脑了。

所以商品与类型的对应关系肯定不能是OneToOne,而应该是OneToMany。

那么OneToOne用在哪里呢?这里说一个地方,在扩展Django的User模型时,因为系统自带的字段不够,所以一种最基本的扩展方法是定义一个User_profile表,用来作为用户的扩展,那么一条用户记录只会有一个扩展表记录,并且这个这个记录也只属于该用户。

ManyToMany

多对多关系,这里我们假设一种情景:

我现在有一个商品表,这个商品有一些图片(不定数量),那么可以使用多对多关系:

class GoodsPicture(models.Model):
  Pic = models.ImageField(upload_to='pic/')

class GoodsMessage(models.Model):
  Title = models.CharField(max_length='100') # 商品标题
  Pic = models.ManyToManyField(GoodsPicture)

这里数据库不同啦,建立了三张表,具体如下:

create table GoodsPicture(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `Pic` varchar(255) NOT NULL, # Django对于图片的保存采用的是二进制图片文件存硬盘,数据库只保存图片路径
  PRIMARY KEY (`id`)
)

create table GoodsMessage(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `Title` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
  # 注意了,这里没有外键约束了
)

create table GoodsMessage_CoodsPicture(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `goodsmessage_id` int(11) NOT NULL,
  `goodpicture_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `goodsmessage_id` (`goodsmessage_id`,`goodspicture_id`),
  FOREIGN KEY (`goodsmessage_id`) REFERENCES `GoodsMessage` (`id`),
  FOREIGN KEY (`goodstype_id`) REFERENCES `GoodsPicture` (`id`)
)

前两个表就不讲了,主要说一下第三个表GoodsMessage_CoodsPicture,

Django用这个表来记录一条数据,内容为:某个商品对应某张图片。其中有一个UNIQUE约束,说明不能有重复的记录。

这样,每次查询GoodsMessage_CoodsPicture表,就能获得某件商品对应的图片。

这里讲了他们在数据库中的实现,那么Django如何来查询这些数据呢,有一篇好的博文推荐给大家:

以上这篇对Django外键关系的描述就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
你应该知道的python列表去重方法
Jan 17 Python
解决uWSGI的编码问题详解
Mar 24 Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
Nov 16 Python
Python获取CPU、内存使用率以及网络使用状态代码
Feb 08 Python
python装饰器常见使用方法分析
Jun 26 Python
Python协程 yield与协程greenlet简单用法示例
Nov 22 Python
Django通用类视图实现忘记密码重置密码功能示例
Dec 17 Python
基于pandas中expand的作用详解
Dec 17 Python
Python实现读取并写入Excel文件过程解析
May 27 Python
如何在mac下配置python虚拟环境
Jul 06 Python
为什么说python更适合树莓派编程
Jul 20 Python
Python 居然可以在 Excel 中画画你知道吗
Feb 15 Python
python绘图模块matplotlib示例详解
Jul 26 #Python
详解Python中正则匹配TAB及空格的小技巧
Jul 26 #Python
基于Django ORM、一对一、一对多、多对多的全面讲解
Jul 26 #Python
Django Rest framework频率原理与限制
Jul 26 #Python
Django 使用easy_thumbnails压缩上传的图片方法
Jul 26 #Python
解决django服务器重启端口被占用的问题
Jul 26 #Python
深入解析神经网络从原理到实现
Jul 26 #Python
You might like
关于尾递归的使用详解
2013/05/02 PHP
php中array_column函数简单实现方法
2016/07/11 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
laravel 判断查询数据库返回值的例子
2019/10/11 PHP
JQuery 1.4 中的Ajax问题
2010/01/23 Javascript
JS 文件传参及处理技巧分析
2010/05/13 Javascript
BootStrap glyphicon图标无法显示的解决方法
2016/09/06 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
JavaScript 总结几个提高性能知识点(推荐)
2017/02/20 Javascript
在 Angular 中实现搜索关键字高亮示例
2017/03/21 Javascript
ReactJs设置css样式的方法
2017/06/08 Javascript
原生JS进行前后端同构
2018/04/22 Javascript
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
jQuery 动态粒子效果示例代码
2020/07/07 jQuery
[01:01:23]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第一场 11.26
2020/11/30 DOTA
Python里隐藏的“禅”
2014/06/16 Python
python实现查找两个字符串中相同字符并输出的方法
2015/07/11 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
2017/07/13 Python
python中(str,list,tuple)基础知识汇总
2018/02/20 Python
利用Python将每日一句定时推送至微信的实现方法
2018/08/13 Python
python 函数的缺省参数使用注意事项分析
2019/09/17 Python
Django实现whoosh搜索引擎使用jieba分词
2020/04/08 Python
如何在python中实现线性回归
2020/08/10 Python
通过实例了解python__slots__使用方法
2020/09/14 Python
python subprocess pipe 实时输出日志的操作
2020/12/05 Python
HUGO BOSS美国官方网上商店:世界知名奢侈品牌
2017/08/04 全球购物
英国假发网站:Hothair
2018/02/23 全球购物
英国50岁以上人群的交友网站:Ourtime
2018/03/28 全球购物
我的求职择业计划书
2014/04/04 职场文书
查摆问题自我剖析材料
2014/08/18 职场文书
2014党员学习兰辉先进事迹思想汇报
2014/09/17 职场文书
教师党的群众路线学习心得体会
2014/11/04 职场文书
2014年工商所工作总结
2014/12/09 职场文书
人民的好儿女观后感
2015/06/18 职场文书
2017元旦、春节期间廉洁自律承诺书
2016/03/25 职场文书
想创业成功,需要掌握这些要点
2019/12/06 职场文书