对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图像处理之反色实现方法
May 30 Python
python实现域名系统(DNS)正向查询的方法
Apr 19 Python
详解Python的collections模块中的deque双端队列结构
Jul 07 Python
python 环境变量和import模块导入方法(详解)
Jul 11 Python
11月编程语言排行榜 Python逆袭C#上升到第4
Nov 15 Python
python使用time、datetime返回工作日列表实例代码
May 09 Python
详解Django定时任务模块设计与实践
Jul 24 Python
Python学习笔记之Zip和Enumerate用法实例分析
Aug 14 Python
Python csv模块使用方法代码实例
Aug 29 Python
Python Des加密解密如何实现软件注册码机器码
Jan 08 Python
pycharm远程连接服务器并配置python interpreter的方法
Dec 23 Python
使用pandas模块实现数据的标准化操作
May 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
德生S2000电路分析
2021/03/02 无线电
PHP正则表达式之捕获组与非捕获组
2015/11/06 PHP
PHP序列化操作方法分析
2016/09/28 PHP
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
分享20多个很棒的jQuery 文件上传插件或教程
2011/09/04 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
jQuery实现tag便签去重效果的方法
2015/01/20 Javascript
深入浅出ES6之let和const命令
2016/08/25 Javascript
JS实现根据用户输入分钟进行倒计时功能
2016/11/14 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
2017/01/22 Javascript
jQuery实现的简单悬浮层功能完整实例
2017/01/23 Javascript
一个有意思的鼠标点击文字特效jquery代码
2017/09/23 jQuery
详解jQuery中的isPlainObject()使用方法
2018/02/27 jQuery
Koa项目搭建过程详细记录
2018/04/12 Javascript
详解javascript appendChild()的完整功能
2018/08/18 Javascript
在 Vue-CLI 中引入 simple-mock实现简易的 API Mock 接口数据模拟
2018/11/28 Javascript
vue中axios请求的封装实例代码
2019/03/23 Javascript
通过vue刷新左侧菜单栏操作
2020/08/06 Javascript
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
使用Python中的线程进行网络编程的入门教程
2015/04/15 Python
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
利用python实现数据分析
2017/01/11 Python
Python实现改变与矩形橡胶的线条的颜色代码示例
2018/01/05 Python
python正则表达式及使用正则表达式的例子
2018/01/22 Python
Python获取网段内ping通IP的方法
2019/01/31 Python
python 获取字典键值对的实现
2020/11/12 Python
python 制作网站小说下载器
2021/02/20 Python
爱尔兰领先的在线体育用品零售商:theGAAstore
2018/04/16 全球购物
StudentUniverse英国:学生航班、酒店和旅游
2019/08/25 全球购物
行政人事专员岗位职责
2014/03/05 职场文书
法律进机关实施方案
2014/03/12 职场文书
环卫工人节活动总结
2014/08/29 职场文书
办公室文员岗位职责
2015/02/04 职场文书
2015年入党积极分子评语
2015/03/26 职场文书
寻找成龙观后感
2015/06/12 职场文书
Linux中文件的基本属性介绍
2022/06/01 Servers