对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 相关文章推荐
Cpy和Python的效率对比
Mar 20 Python
Python基础入门之seed()方法的使用
May 15 Python
python字典的常用操作方法小结
May 16 Python
python 根据pid杀死相应进程的方法
Jan 16 Python
Python 对象中的数据类型
May 13 Python
Python实现简易Web爬虫详解
Jan 03 Python
修复 Django migration 时遇到的问题解决
Jun 14 Python
给你一面国旗 教你用python画中国国旗
Sep 24 Python
python3 pathlib库Path类方法总结
Dec 26 Python
jupyter notebook参数化运行python方式
Apr 10 Python
使用python求斐波那契数列中第n个数的值示例代码
Jul 26 Python
Python通过Schema实现数据验证方式
Nov 12 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
绿山咖啡和蓝山咖啡
2021/03/04 新手入门
木翼下载系统中说明的PHP安全配置方法
2007/06/16 PHP
用PHP实现读取和编写XML DOM代码
2010/04/07 PHP
PHP生成RSS文件类实例
2014/12/05 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
2016/02/15 PHP
Javascript调试工具(下载)
2007/01/09 Javascript
jquery判断字符输入个数(数字英文长度记为1,中文记为2,超过长度自动截取)
2010/10/15 Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
2013/02/06 Javascript
JavaScript栏目列表隐藏/显示简单实现
2013/04/03 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
JavaScript实现表格排序方法
2013/06/14 Javascript
JavaScript简单实现鼠标拖动选择功能
2014/03/06 Javascript
javascript等号运算符使用详解
2015/04/16 Javascript
node.js插件nodeclipse安装图文教程
2020/10/19 Javascript
浅析jQuery中使用$所引发的问题
2016/05/29 Javascript
Bootstrap表单控件使用方法详解
2017/01/11 Javascript
Nodejs实现用户注册功能
2019/04/14 NodeJs
微信小程序和百度的语音识别接口详解
2019/05/06 Javascript
layui(1.0.9)文件上传upload,前后端的实例代码
2019/09/26 Javascript
JavaScript实现京东放大镜效果
2019/12/03 Javascript
vue数据响应式原理知识点总结
2020/02/16 Javascript
详解ES6实现类的私有变量的几种写法
2021/02/10 Javascript
[42:39]老党炸弹人试玩视频
2014/09/03 DOTA
[01:48]完美圣典齐天大圣至宝宣传片
2016/12/17 DOTA
Mac下Supervisor进程监控管理工具的安装与配置
2014/12/16 Python
Python下使用Psyco模块优化运行速度
2015/04/05 Python
Python 数值区间处理_对interval 库的快速入门详解
2018/11/16 Python
Python Pandas 如何shuffle(打乱)数据
2019/07/30 Python
UNIX文件类型
2013/08/29 面试题
青年志愿者活动总结
2014/04/26 职场文书
2015年12.4全国法制宣传日活动总结
2015/03/24 职场文书
设备技术员岗位职责
2015/04/11 职场文书
项目经理助理岗位职责
2015/04/13 职场文书
运动会广播稿300字
2015/08/19 职场文书
运动会跳远广播稿
2015/08/19 职场文书
Android自定义scrollview实现回弹效果
2022/04/01 Java/Android