Django 自学笔记兼学习教程第4章第3节——模型(models)主键外键

点击查看教程总目录

参考:https://docs.djangoproject.com/en/2.2/ref/models/fields/

1 主键

梳理自官方文档:automatic-primary-key-fields

不设置主键的情况下,Django会自动为每个模型提供以下字段:

id = models.AutoField(primary_key=True)

这是个自增(auto-incrementing)主键

如果你在其他字段上设置了primary_key=True, 那么Django就不会自动给该模型添加上面的id主键了。

每个模型都需要一个字段primary_key=True(显式声明或自动添加)。

2 “复合主键”

与其说这里设置的是“复合主键”,不如说是唯一约束,因为

  1. 设置了“复合主键”,该模型仍然会生成1中的自增id,以其作为主键
  2. 设置的方法和设置约束的方法是一样的。

这里先给出一个“复合主键”代码例子,

学生以年级号、年级子学号为复合主键(唯一约束)

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是一个唯一约束,其中fieldsname都是必须要设置的参数

  • 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:第一个参数,指定其外键是哪个模型,上面的例子中是Teacher
  • on_delete: 当被一个ForeignKey引用的对象被删除时,Django将模拟on_delete参数指定的SQL约束对应的行为。通俗的来讲,这个参数设置的是删除外键引用的对象时的影响。

on_delete的可选项可以在django.db.models中找到,具体如下

  • CASCADE:联级删除,删除外键引用的对象时,也删除所有包含该外键的对象。

    比如一个老师对应多个课程,删除一个老师,也删除该老师的所有课程。
  • PROTECT: 阻止删除(通过抛出异常 ProtectedError
  • SET_NULL: 将外键设置为null
  • SET_DEFAULT: 将外键设置为default
  • SET()
  • 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)主键外键的更多相关文章

  1. Django笔记&教程 6-3 使用模型(models)创建表单(form)

    Django 自学笔记兼学习教程第6章第3节--使用模型(models)创建表单(form) 点击查看教程总目录 本文参考:Forms for models 1 - 初步介绍 很多时候,我们使用的表单 ...

  2. Django笔记&教程 总目录

    本篇博客只有目录,正文内容在目录章节链接的博客里 除目录本身外,没有链接的章节,说明内容还没开始编辑 本项目笔记仍在不断创作中,还有些内容会根据自身所学不断更新完善 本项目主要为markdwon文档, ...

  3. EF中主表和附表一起提交的话,如果主附表的主键外键已经设定。

    EF中主表和附表一起提交的话,如果主附表的主键外键已经设定,如果新增同时新增主表和附表的记录,那么在EF同时提交时,不需要人为的设定附表的主表的主键值,EF会自动为附表添加外键值.

  4. 第15课-数据库开发及ado.net-数据库介绍,主键,外键,启动数据库,数据库身份验证方式,建表,分离数据库

    第15课-数据库开发及ado.net 数据库介绍,主键,外键,启动数据库,数据库身份验证方式,建表,分离数据库 1.  学习方法 2.  多涨见识 3.  比自己强的人一起,学习更强:比自己更聪明的人 ...

  5. 关系型数据库——主键&外键的

    一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键  比如   学生表(学号,姓名,性别,班级)  其中每个学 ...

  6. CUBRID学习笔记 21 查看主键外键索引

    命令 show create table game; game是表名 在web管理中,请在sql标签中查,不要在query中执行. show create table game; === <Re ...

  7. 5 Django系列之通过list_display展示多对多与外键内容在admin-web界面下

    list_display展示多对多关系的内容 表结构关系 表一 class Server(models.Model): asset = models.OneToOneField('Asset') cr ...

  8. EF实体框架-从数据库更新模型 一部分表的外键(导航属性)无法显示

    从数据库更新模型 要想让数据库表之间的外键关系 显示到实体模型的导航属性中去. 表的外键 对应另一张表的字段要是主键,唯一键显示不出来

  9. 一个模型中有两个外键指向同一张表时,创建迁移模型时报错:“ 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=' ...

随机推荐

  1. Python实现一个简单三层神经网络的搭建并测试

    python实现一个简单三层神经网络的搭建(有代码) 废话不多说了,直接步入正题,一个完整的神经网络一般由三层构成:输入层,隐藏层(可以有多层)和输出层.本文所构建的神经网络隐藏层只有一层.一个神经网 ...

  2. 什么鬼?你还搞不懂json和字典的区别??

    现在自动化培训烂大街,是个人都能说的上几个框架,面试如果问框架相关问题,求职者只需一瓶 82 年的雪碧,会吹的让你怀疑人生!所以面试官为了更清楚的知道你是停留在表面上的花拳绣腿还是有扎实的基础,就不会 ...

  3. 这两个基础seo插件,wordpress网站必装

    WordPress对搜索引擎非常友好,这一点很多人都知道.不过我们在制作完成WordPress主题后,还可以在原来的良好基础上,添加两个队seo非常有利的WordPress插件. 第一个插件:Baid ...

  4. 纯净Ubuntu16安装CUDA(9.1)和cuDNN

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. 一文读懂 Serverless,将配置化思想复用到平台系统中

    作者 | 春哥大魔王 来源 | Serverless 公众号 写在前面 在 SaaS 领域 Salesforce 是佼佼者,其 CRM 的概念已经扩展到了 Marketing.Sales.Servic ...

  6. sql提示1055 不让你group by

    是不是突然写好的sql语句 部署上去就 Expression #2 of SELECT list is not in GROUP BY clause and containsnonaggregated ...

  7. NOI2016区间bzoj4653(线段树,尺取法,区间离散化)

    题目描述 在数轴上有 \(N\) 个闭区间 \([l_1,r_1],[l_2,r_2],...,[l_n,r_n]\) .现在要从中选出 \(M\) 个区间,使得这 \(M\) 个区间共同包含至少一个 ...

  8. 关于C、Java、Python程序运行耗时及内存用量

    最近没有刷题,而是在PTA找几个题目寻找有关程序输入流问题以及各种语言在运行时对计算机消耗内存的问题, 以免很多同学解题的时候发现自己做的对但是出现运行超时的问题:针对运行内存,肯定用C/C++的同学 ...

  9. flask 之 请求钩子

    请求钩子 什么是请求钩子? 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要统一处理,为了让每个视图函数避免编写重复功能的代码,flask提供了统一的接口可以添加这些处理函数,即请求钩子. f ...

  10. 分布式系统ID

    Leaf--美团点评分布式ID生成系统 前言 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.如在美团点评的金融.支付.餐饮.酒店.猫眼电影等产品的系统中,数据日渐增长,对数据分库分表后需 ...