对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 相关文章推荐
Python3安装Pymongo详细步骤
May 26 Python
python+pygame简单画板实现代码实例
Dec 13 Python
对Tensorflow中权值和feature map的可视化详解
Jun 14 Python
python机器学习之神经网络实现
Oct 13 Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
Apr 16 Python
python交易记录链的实现过程详解
Jul 03 Python
pandas的连接函数concat()函数的具体使用方法
Jul 09 Python
django 微信网页授权认证api的步骤详解
Jul 30 Python
flask框架配置mysql数据库操作详解
Nov 29 Python
Django 实现将图片转为Base64,然后使用json传输
Mar 27 Python
keras 实现轻量级网络ShuffleNet教程
Jun 19 Python
python 贪心算法的实现
Sep 18 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计算一年多少个星期和每周的开始和结束日期
2014/07/01 PHP
PHP将字符分解为多个字符串的方法
2014/11/22 PHP
PHP时间函数使用详解
2019/03/21 PHP
javascript计时器事件使用详解
2014/01/07 Javascript
jQuery 选择器详解
2015/01/19 Javascript
一次$.getJSON不执行的简单记录
2016/07/19 Javascript
浅谈angularjs module返回对象的坑(推荐)
2016/10/21 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
jQuery实现删除li节点的方法
2016/12/06 Javascript
JS绘制微信小程序画布时钟
2016/12/24 Javascript
js数字计算 误差问题的快速解决方法
2017/02/28 Javascript
Vuex之理解Store的用法
2017/04/19 Javascript
解决vue页面DOM操作不生效的问题
2018/03/17 Javascript
js如何找出字符串中的最长回文串
2018/06/04 Javascript
小程序ios音频播放没声音问题的解决
2018/07/11 Javascript
如何用原生js写一个弹窗消息提醒插件
2019/05/24 Javascript
微信小程序项目总结之记账小程序功能的实现(包括后端)
2019/08/20 Javascript
vue 开发企业微信整合案例分析
2019/12/02 Javascript
JavaScript对象字面量和构造函数原理与用法详解
2020/04/18 Javascript
JS判断浏览器类型与操作系统的方法分析
2020/04/30 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
2020/09/22 Javascript
Vue Elenent实现表格相同数据列合并
2020/11/30 Vue.js
Python网络爬虫项目:内容提取器的定义
2016/10/25 Python
Python反射和内置方法重写操作详解
2018/08/27 Python
python 中的[:-1]和[::-1]的具体使用
2020/02/13 Python
基于python实现FTP文件上传与下载操作(ftp&sftp协议)
2020/04/01 Python
Python数据库封装实现代码示例解析
2020/09/05 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
2021/01/12 Python
HTML5利用约束验证API来检查表单的输入数据的代码实例
2016/12/20 HTML / CSS
美国精品家居用品网站:US-Mattress
2016/08/24 全球购物
全球酒店比价网:HotelsCombined
2017/06/20 全球购物
投标授权委托书范文
2014/08/02 职场文书
优秀班组申报材料
2014/12/25 职场文书
天鹅湖观后感
2015/06/09 职场文书
分享CSS盒子模型隐藏的几种方式
2022/02/28 HTML / CSS
python_tkinter事件类型详情
2022/03/20 Python