对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的web框架中中编写日志列表的教程
Apr 30 Python
详解Python中的静态方法与类成员方法
Feb 28 Python
Python反射用法实例简析
Dec 22 Python
python生成tensorflow输入输出的图像格式的方法
Feb 12 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
Jun 11 Python
Python 元组拆包示例(Tuple Unpacking)
Dec 24 Python
Tensorflow中的dropout的使用方法
Mar 13 Python
Python基于pyecharts实现关联图绘制
Mar 27 Python
QML用PathView实现轮播图
Jun 03 Python
Python定时任务APScheduler安装及使用解析
Aug 07 Python
Python Charles抓包配置实现流程图解
Sep 29 Python
一篇文章带你了解Python和Java的正则表达式对比
Sep 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
php下HTTP Response中的Chunked编码实现方法
2008/11/19 PHP
如何利用http协议发布博客园博文评论
2015/08/03 PHP
PHP 图片合成、仿微信群头像的方法示例
2019/10/25 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
超强的IE背景图片闪烁(抖动)的解决办法
2007/09/09 Javascript
获取URL地址中的文件名和参数的javascript代码
2009/09/02 Javascript
jQuery select操作控制方法小结
2010/05/26 Javascript
图片onload事件触发问题解决方法
2011/07/31 Javascript
JavaScript中的逻辑判断符&&、||与!介绍
2014/12/31 Javascript
javascript实现网站加入收藏功能
2015/12/16 Javascript
AngularJS ng-repeat数组有重复值的解决方法
2016/10/23 Javascript
js实现背景图自适应窗口大小
2017/01/10 Javascript
Vue单文件组件基础模板小结
2017/08/10 Javascript
vue.js异步上传文件前后端实现代码
2017/08/22 Javascript
JavaScript实现百度搜索框效果
2020/03/26 Javascript
微信小程序实现搜索框功能及踩过的坑
2020/06/19 Javascript
vue 动态组件(component :is) 和 dom元素限制(is)用法说明
2020/09/04 Javascript
[42:25]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第三场
2018/04/06 DOTA
跟老齐学Python之从if开始语句的征程
2014/09/14 Python
尝试使用Python多线程抓取代理服务器IP地址的示例
2015/11/09 Python
python创建列表和向列表添加元素的实现方法
2017/12/25 Python
python 实现二维列表转置
2019/12/02 Python
Python实现SMTP邮件发送
2020/06/16 Python
几款Python编译器比较与推荐(小结)
2020/10/15 Python
美国电视购物HSN官网:HSN
2016/09/07 全球购物
斯德哥尔摩通票:Stockholm Pass
2018/01/09 全球购物
澳大利亚波西米亚风连衣裙在线商店:Fortunate One
2019/04/01 全球购物
Antonioli美国在线商店:时尚前卫奢华
2019/07/29 全球购物
英语自荐信常用语句
2013/12/13 职场文书
财务管理专业自荐信范文
2013/12/24 职场文书
档案接收函范文
2014/01/10 职场文书
公积金单位接收函
2014/01/11 职场文书
大型主题婚礼活动策划方案
2014/09/15 职场文书
法人代表证明书范本
2015/06/18 职场文书
深入浅析python3 依赖倒置原则(示例代码)
2021/07/09 Python
Springboot中如何自动转JSON输出
2022/06/16 Java/Android