Django笔记&教程 4-3 模型(models)主键外键
Django 自学笔记兼学习教程第4章第3节——模型(models)主键外键
点击查看教程总目录
1 主键
梳理自官方文档:automatic-primary-key-fields
不设置主键的情况下,Django会自动为每个模型提供以下字段:
id = models.AutoField(primary_key=True)
这是个自增(auto-incrementing)主键
如果你在其他字段上设置了primary_key=True, 那么Django就不会自动给该模型添加上面的id主键了。
每个模型都需要一个字段primary_key=True(显式声明或自动添加)。
2 “复合主键”
与其说这里设置的是“复合主键”,不如说是唯一约束,因为
- 设置了“复合主键”,该模型仍然会生成1中的自增id,以其作为主键
- 设置的方法和设置约束的方法是一样的。
这里先给出一个“复合主键”代码例子,
学生以年级号、年级子学号为复合主键(唯一约束)
class Student(models.Model):
grade = models.CharField(max_length=4, verbose_name="年级")
number = models.CharField(max_length=6, verbose_name="年级子学号")
# other attritudes ...
class Meta:
constraints = [
# 复合主键:保证 grade和number组合的student_id唯一
models.UniqueConstraint(fields=['grade', 'number'], name='student_id'),
]
设置约束的写法如上。
这里我们只解释下这一个约束本身。(至于meta则会有空在本章(第四章)后面专门说下)
models.UniqueConstraint(fields=['grade', 'number'], name='student_id')
UniqueConstraint是一个唯一约束,其中fields和name都是必须要设置的参数
fields:字段名列表,指定哪几个字段名要满足唯一约束。name:约束名。
注意:这里的约束名只是该约束的名称而已,不是数据库的字段,不能用该约束名去搜索查找
3 外键(ForeignKey)
梳理自官方文档:automatic-primary-key-fields
在Django里,外键(ForeignKey)是一种关系字段(Relationship fields)
对于多对一关系,比如一个老师可以设置多个课程,可以直接像下面这样来写:
class Teacher(models.Model):
name = models.CharField(max_length=50, verbose_name="姓名")
# other attritudes ...
class Course(models.Model):
name = models.CharField(max_length=50, verbose_name="课程名")
# other attritudes ...
teacher = models.ForeignKey(Teacher, verbose_name="课程教师", on_delete=models.CASCADE)
ForeignKey有两个必需要设置的参数:
to:第一个参数,指定其外键是哪个模型,上面的例子中是Teacheron_delete: 当被一个ForeignKey引用的对象被删除时,Django将模拟on_delete参数指定的SQL约束对应的行为。通俗的来讲,这个参数设置的是删除外键引用的对象时的影响。
on_delete的可选项可以在django.db.models中找到,具体如下
CASCADE:联级删除,删除外键引用的对象时,也删除所有包含该外键的对象。
比如一个老师对应多个课程,删除一个老师,也删除该老师的所有课程。PROTECT: 阻止删除(通过抛出异常ProtectedError)SET_NULL: 将外键设置为nullSET_DEFAULT: 将外键设置为defaultSET()DO_NOTHING
4 其他关系
本文第三部分中的外键ForeignKey是一种多对一关系,
除了这种,Django中还实现了其他关系字段,这里罗列下并展示下其简单写法,
想了解更多可以通过点击其对应的链接去看对应的官方文档
# 一个课程可以有多个助教,一个助教可以辅导多个课程,这是一种多对多关系
assistant = models.ForeignKey(Teacher, verbose_name="助理教师")
- OneToOneField
# 比如每一个老师都有一个自己的单独办公室,是一种一对一关系
class Office(models.Model):
number = models.CharField(max_length=50, verbose_name="办公室号码")
# other attritudes ...
teacher = models.ForeignKey(Teacher, verbose_name="办公室老师")
Django笔记&教程 4-3 模型(models)主键外键的更多相关文章
- Django笔记&教程 6-3 使用模型(models)创建表单(form)
Django 自学笔记兼学习教程第6章第3节--使用模型(models)创建表单(form) 点击查看教程总目录 本文参考:Forms for models 1 - 初步介绍 很多时候,我们使用的表单 ...
- Django笔记&教程 总目录
本篇博客只有目录,正文内容在目录章节链接的博客里 除目录本身外,没有链接的章节,说明内容还没开始编辑 本项目笔记仍在不断创作中,还有些内容会根据自身所学不断更新完善 本项目主要为markdwon文档, ...
- EF中主表和附表一起提交的话,如果主附表的主键外键已经设定。
EF中主表和附表一起提交的话,如果主附表的主键外键已经设定,如果新增同时新增主表和附表的记录,那么在EF同时提交时,不需要人为的设定附表的主表的主键值,EF会自动为附表添加外键值.
- 第15课-数据库开发及ado.net-数据库介绍,主键,外键,启动数据库,数据库身份验证方式,建表,分离数据库
第15课-数据库开发及ado.net 数据库介绍,主键,外键,启动数据库,数据库身份验证方式,建表,分离数据库 1. 学习方法 2. 多涨见识 3. 比自己强的人一起,学习更强:比自己更聪明的人 ...
- 关系型数据库——主键&外键的
一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学 ...
- CUBRID学习笔记 21 查看主键外键索引
命令 show create table game; game是表名 在web管理中,请在sql标签中查,不要在query中执行. show create table game; === <Re ...
- 5 Django系列之通过list_display展示多对多与外键内容在admin-web界面下
list_display展示多对多关系的内容 表结构关系 表一 class Server(models.Model): asset = models.OneToOneField('Asset') cr ...
- EF实体框架-从数据库更新模型 一部分表的外键(导航属性)无法显示
从数据库更新模型 要想让数据库表之间的外键关系 显示到实体模型的导航属性中去. 表的外键 对应另一张表的字段要是主键,唯一键显示不出来
- 一个模型中有两个外键指向同一张表时,创建迁移模型时报错:“ HINT: Add or change a related_name argument to the definition for 'AnswersModel.author' or 'AnswersModel.relay_to'.”解决方案
class AnswersModel(models.Model): author = models.ForeignKey(FrontUserModel,null=True,related_name=' ...
随机推荐
- SDOI2015 排序
SDOI2015 排序 今天看到这道题,没有一点思路,暴力都没的打...还是理解错题意了,操作不同位置不是说改不同的区间,而是不同操作的顺序...考场上如果知道这个的话最少暴力拿一半啊,因为正解本来就 ...
- 阿里云 Serverless 再升级,从体验上拉开差距
差距都在细节上. Serverless 要成就云计算的下一个 10 年,不仅需要在技术上持续精进,也需要在产品体验上精耕细作. 近日,阿里云 Serverless 再度升级,发布了一系列围绕产品体验方 ...
- 洛谷3769[CH弱省胡策R2]TATT (KDTree)(四维LIS)
真是一个自闭的题目(调了一个上午+大半个下午) 从\(WA\)到\(WA+TLE\)到\(TLE\)到\(AC\) 真的艰辛. 首先,这个题,我们可以考虑直接上四维KDTree来解决. 对于kdtre ...
- 洛谷3721 HNOI2017单旋(LCT+set+思维)
这题难道不是spaly裸题吗? 言归正传QWQ 一看到这个题目,其实第一反应是很懵X的 从来没有见过类似的题目啊,什么\(spaly\),单旋.QWQ很懵逼啊 不过,我们可以注意到这么一件事情,就是我 ...
- Android应用开发特色
目录 Android应用开发特色 四大组件 Activity Service Broadcastreceiver Contentprovider 丰富的系统控件 Sqlite数据库 强大的多媒体 An ...
- 【Java虚拟机5】Java内存模型(硬件层面的并发优化基础知识--指令乱序问题)
前言 其实之前大家都了解过volatile,它的第一个作用是保证内存可见,第二个作用是禁止指令重排序.今天系统学习下为什么CPU会指令重排. 存储器的层次结构图 1.CPU乱序执行指令的根源 CPU读 ...
- 【数据结构与算法Python版学习笔记】图——拓扑排序 Topological Sort
概念 很多问题都可转化为图, 利用图算法解决 例如早餐吃薄煎饼的过程 制作松饼的难点在于知道先做哪一步.从图7-18可知,可以首先加热平底锅或者混合原材料.我们借助拓扑排序这种图算法来确定制作松饼的步 ...
- 用例圖學習實例 / Learning Use Case Diagram by Examples
什麼是用例圖? 用例描述了一個演員和感興趣的系統之間的一系列交互,以達到某種特定目標,並由某種觸發事件引發.用例滿足需求或為演員解決問題.用例圖包含一組用例,可以通過從每個角色的不同角度講述系統將如何 ...
- 关于tkinter
tkinter介绍 tkinter是python自带的GUI库,是对图形库TK的封装tkinter是一个跨平台的GUI库,开发的程序可以在win,linux或者mac下运行 组件概念 一个窗口中任意内 ...
- BUAA-软件工程第一次作业
软件工程第一次作业 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 第1次个人作业 我在这个课程的目标 团队完成好的软件,并对自己作出规划 这个作 ...