对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操作Elasticsearch数据索引的教程
Apr 08 Python
Python实现合并字典的方法
Jul 07 Python
Python遍历文件夹和读写文件的实现代码
Aug 28 Python
Django基础之Model操作步骤(介绍)
May 27 Python
Python3实现统计单词表中每个字母出现频率的方法示例
Jan 28 Python
Python函数定义及传参方式详解(4种)
Mar 18 Python
超简单使用Python换脸实例
Mar 27 Python
python 画出使用分类器得到的决策边界
Aug 21 Python
PyQt5多线程刷新界面防假死示例
Dec 13 Python
Python3 把一个列表按指定数目分成多个列表的方式
Dec 25 Python
Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的
Apr 20 Python
python从Oracle读取数据生成图表
Oct 14 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
分割GBK中文遭遇乱码的解决方法
2013/08/09 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
2014/06/30 PHP
php绘图之在图片上写中文和英文的方法
2015/01/24 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
JXTree对象,读取外部xml文件数据,生成树的函数
2007/04/02 Javascript
google地图的路线实现代码
2009/08/20 Javascript
javascript实现tabs选项卡切换效果(自写原生js)
2013/03/19 Javascript
js遍历、动态的添加数据的小例子
2013/06/22 Javascript
Jquery时间验证和转换工具小例子
2013/07/01 Javascript
JS短路原理的应用示例 精简代码的途径
2013/12/13 Javascript
qq悬浮代码(兼容各个浏览器)
2014/01/29 Javascript
jquery实现带缩略图的可定制高度画廊效果(5种)
2015/08/28 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
2016/06/07 Javascript
Bootstrap实现input控件失去焦点时验证
2016/08/04 Javascript
Bootstrap table的使用方法
2016/11/02 Javascript
jquery hover 不停闪动问题的解决方法(亦为stop()的使用)
2017/02/10 Javascript
mui 打开新窗口的方式总结及注意事项
2017/08/20 Javascript
微信小程序使用picker实现时间和日期选择框功能【附源码下载】
2017/12/11 Javascript
详解vue使用$http服务端收不到参数
2019/04/19 Javascript
深入探索VueJS Scoped CSS 实现原理
2019/09/23 Javascript
vue基于better-scroll仿京东分类列表
2020/06/30 Javascript
vue-cli3项目配置eslint代码规范的完整步骤
2020/09/10 Javascript
Selenium执行JavaScript脚本的方法示例
2020/12/31 Javascript
python在多玩图片上下载妹子图的实现代码
2013/08/13 Python
python简单文本处理的方法
2015/07/10 Python
python方向键控制上下左右代码
2018/01/20 Python
Python内建模块struct实例详解
2018/02/02 Python
Python3匿名函数用法示例
2018/07/25 Python
python tkinter界面居中显示的方法
2018/10/11 Python
Django中的静态文件管理过程解析
2019/08/01 Python
python 装饰器重要在哪
2021/02/14 Python
师范应届毕业生自荐信
2013/11/18 职场文书
小学科学教学反思
2014/01/26 职场文书
党员领导干部民主生活会批评与自我批评发言
2014/09/28 职场文书
幼儿教师2014年度工作总结
2014/12/16 职场文书
一文了解Java动态代理的原理及实现
2022/07/07 Java/Android