对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批量导出导入MySQL用户的方法
Nov 15 Python
python socket网络编程步骤详解(socket套接字使用)
Dec 06 Python
python实现的守护进程(Daemon)用法实例
Jun 02 Python
pyqt5简介及安装方法介绍
Jan 31 Python
python 用lambda函数替换for循环的方法
Jun 09 Python
对python模块中多个类的用法详解
Jan 10 Python
python numpy 按行归一化的实例
Jan 21 Python
pywinauto自动化操作记事本
Aug 26 Python
python实现字符串和数字拼接
Mar 02 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
May 26 Python
Virtualenv 搭建 Py项目运行环境的教程详解
Jun 22 Python
如何教少儿学习Python编程
Jul 10 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
PHPwind整合最土系统用户同步登录实现方法
2010/12/08 PHP
php 判断字符串中是否包含html标签
2014/02/17 PHP
thinkphp中session和cookie无效的解决方法
2014/12/19 PHP
PHP的命令行命令使用指南
2015/08/18 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
PHP面向对象程序设计模拟一般面向对象语言中的方法重载(overload)示例
2019/06/13 PHP
jQuery 图像裁剪插件Jcrop的简单使用
2009/05/22 Javascript
关于COOKIE个数与大小的问题
2011/01/17 Javascript
jQuery表格插件datatables用法总结
2014/09/05 Javascript
Javascript动画的实现原理浅析
2015/03/02 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
编写高性能Javascript代码的N条建议
2015/10/12 Javascript
Bootstrap简单表单显示学习笔记
2016/11/15 Javascript
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
vue动态生成dom并且自动绑定事件
2017/04/19 Javascript
Bootstrap Table使用整理(二)
2017/06/09 Javascript
jQuery列表检索功能实现代码
2017/07/17 jQuery
VUE中使用Vue-resource完成交互
2017/07/21 Javascript
详解express使用vue-router的history踩坑
2019/06/05 Javascript
vue+openlayers绘制省市边界线
2020/12/24 Vue.js
复习Python中的字符串知识点
2015/04/14 Python
Python使用Scrapy爬取妹子图
2015/05/28 Python
Python中字典(dict)合并的四种方法总结
2017/08/10 Python
PyQt5每天必学之切换按钮
2020/08/20 Python
基于tensorflow加载部分层的方法
2018/07/26 Python
Django 限制用户访问频率的中间件的实现
2018/08/23 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
2019/06/18 Python
python编写俄罗斯方块
2020/03/13 Python
Django serializer优化类视图的实现示例
2020/07/16 Python
python3获取控制台输入的数据的具体实例
2020/08/16 Python
建筑工程专业学生的自我评价
2013/12/25 职场文书
小学生竞选班长演讲稿
2014/04/24 职场文书
员工廉洁自律承诺书
2014/05/26 职场文书
python 解决微分方程的操作(数值解法)
2021/05/26 Python
关于Nginx中虚拟主机的一些冷门知识小结
2022/03/03 Servers
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
2022/06/21 Golang