对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调用浏览器并打开一个网址的例子
Jun 05 Python
python分析网页上所有超链接的方法
May 08 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
Jan 04 Python
python实现pdf转换成word/txt纯文本文件
Jun 07 Python
python paramiko利用sftp上传目录到远程的实例
Jan 03 Python
python设计tcp数据包协议类的例子
Jul 23 Python
python实现的发邮件功能示例
Sep 11 Python
python 正则表达式参数替换实例详解
Jan 17 Python
Python json模块与jsonpath模块区别详解
Mar 05 Python
Python迭代器Iterable判断方法解析
Mar 16 Python
Python中猜拳游戏与猜筛子游戏的实现方法
Sep 04 Python
聊聊pytorch测试的时候为何要加上model.eval()
May 23 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
一个基于PDO的数据库操作类
2011/03/24 PHP
CodeIgniter实现更改view文件夹路径的方法
2014/07/04 PHP
PHP7 新特性详细介绍
2016/09/06 PHP
jQuery 使用手册(六)
2009/09/23 Javascript
JavaScript数据类型之基本类型和引用类型的值
2015/04/01 Javascript
jQuery表格行上移下移和置顶的实现方法
2015/10/08 Javascript
jquery配合.NET实现点击指定绑定数据并且能够一键下载
2016/10/28 Javascript
JS 全屏和退出全屏详解及实例代码
2016/11/07 Javascript
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
jQuery ajax请求struts action实现异步刷新
2017/04/19 jQuery
Vue 项目分环境打包的方法示例
2018/08/03 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
2019/09/25 Javascript
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
[47:43]完美世界DOTA2联赛PWL S3 Magama vs GXR 第二场 12.19
2020/12/24 DOTA
python3爬取淘宝信息代码分析
2018/02/10 Python
python psutil库安装教程
2018/03/19 Python
Python简单定义与使用二叉树示例
2018/05/11 Python
Python迭代器与生成器用法实例分析
2018/07/09 Python
python多行字符串拼接使用小括号的方法
2020/03/19 Python
Python 给定的经纬度标注在地图上的实现方法
2019/07/05 Python
Python实现打印实心和空心菱形
2019/11/23 Python
Python+redis通过限流保护高并发系统
2020/04/15 Python
浅谈HTML5 Web Worker的使用
2018/01/05 HTML / CSS
事业单位分类改革实施方案
2014/03/21 职场文书
全国税务系统先进集体事迹材料
2014/05/19 职场文书
安全负责人任命书
2014/06/06 职场文书
个人剖析材料及整改措施
2014/10/07 职场文书
民政局离婚协议书范本
2014/10/20 职场文书
全国法院系统开展党的群众路线教育实践活动综述(全文)
2014/10/25 职场文书
使用Redis实现秒杀功能的简单方法
2021/05/08 Redis
如何用PHP实现分布算法之一致性哈希算法
2021/05/26 PHP
idea搭建可运行Servlet的Web项目
2021/06/26 Java/Android
spring boot中nativeQuery的用法
2021/07/26 Java/Android
漫画《催眠麦克风-Dawn Of Divisions》第二卷PV公开
2022/04/05 日漫
SQL Server携程核心系统无感迁移到MySQL实战
2022/06/01 SQL Server
Python可视化神器pyecharts之绘制箱形图
2022/07/07 Python