Django自学笔记 4-3 模型(models)主键外键

Django之主键外键详解 在ORM操作处了解的文章中,我们已经初步接触到了主键与外键的字段定义,那么本文以详细介绍主键外键的使用方法等。 阅读详情

————总目录——前言——框架版本————

======================= 大爽歌作,made by big shuang =======================

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

三、模型(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. 设置了“复合主键”,该模型仍然会生成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是一个唯一约束,其中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:第一个参数,指定其外键是哪个模型,上面的例子中是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基础教程(三十六)Django模型关系字段之外键字段:别硬撑了!Django模型关系“相亲角”,外键字段才是你的最强僚机 在Django的模型世界里,如果你的数据表还在一座孤岛上单打独斗,那你就Out了!本文将带你深度“盘一盘”Django的关系字段之王——外键。我们将用最接地气的“相亲”比喻,从底层逻辑到实战代码,手把手教你如何用ForeignKey为你的数据牵线搭桥。从一对多关系到反向查询的骚操作,从数据库约束到性能优化避坑指南,让你彻底明白,没有外键的Django项目,就像没有灵魂的代码空壳。文末附完整博客系统示例,一看就懂,一学就会! 阅读详情

相关推荐

django之十三--通过pk值手动设置数据表主键

一、前言 通过django框架的Model层来新增数据库表时,如果在需要新增的表字段里任何一个表字段都没设置主键,框架会默认新增一个表字段id并把该表字段id设置为主键。 那么,如果我们想自己动手设置其中一个新增的表字段A为主键,需要在这表字段A所对应调用的方法里加个参数primary_key且参数primary_key值必须等于True。 细节: ①.参数primary_key,一般简称为pk,俗称主键。 二、默认id主键的实现流程 1、首先,在项目绝对路径【helloworld/hello/

1、测试博主技术知识分享 2、pos行业知识技术分享 3、java后端技术知识分享 4、嵌入式技术知识分享 5、运维部署相关知识分享 1949

Django model 表与表之间的关联(外键、一对一、多对多、联合主键)

在这个示例中,Order 模型中的主键是 ‘order_id’ 和 ‘customer_id’ 两个字段的组合,我们使用了 django-composite-foreignkey 库中的 CompositeForeignKey 来定义了一个联合外键,将 customer 字段与 Customer 模型关联起来。例如,如果有一个“作者”(Author)模型和一个“书籍”(Book)模型,你可以在“书籍”模型中定义一个外键,将其指向“作者”模型的主键。这样,每个书籍都可以与一个作者关联起来。

qq_38393271的博客 5107

Django实现xAdmin后台统计外键关联内容数据

需要在models.py中定义相应的模型。本例中,以文章大类()和文章栏目()为例,文章栏目通过外键关联到文章大类。# 内容大类类别模型category_name = models.CharField(max_length=20, verbose_name='文章类别名称', help_text="文章类别名称")# 其他字段...verbose_name = '文章类别管理'这里,表示文章的大类,而表示文章的栏目,并且栏目通过外键关联到大类。接下来,将在xadmin后台展示每个大类下的栏目数量。

Mr数据杨 3万+

Django‘模型类的字段类型介绍

Ben_boba的博客 1980

OpenHarmony系统参数权限配置避坑指南:从param get/set失败到SELinux标签实战

本文深入解析OpenHarmony系统参数权限配置的常见问题与解决方案,涵盖DAC和SELinux双重权限控制机制。通过实战案例演示如何配置`param get/set`权限,解决'Permission denied'错误,并提供三方应用访问参数的安全方案,帮助开发者高效完成系统调试与优化。

weixin_27013291的博客 449

基于 VS Code + CMake + Make + GNU工具链 + OpenOCD 的通用MCU开发环境搭建教程

以CH32V307(RISCV)和STM32F103(Cortex-M3)为例的Vscode+gnu单片机环境搭建。

余十三_的博客 2176

django 复合主键(composit primary key)

【原帖:http://www.yihaomen.com/article/python/252.htm】 项目开发中,不是所有表都只有一个主键。如果只有一个主键的情况,django 很容易做,也很好做。 在models.py 中定义 class 时,可以直接实现: 比如: class Category(models.Model):     catid = models.CharField(

mapoor的专栏 3343

用友T3提示,年度[UFDATA_002_2017]并不存在,导致无法备份迁移。

用友T3提示,年度[UFDATA_002_2017]并不存在,导致无法备份迁移。现在都win11了某个年度账套不存在怎么办?

雨季余静的博客 3563

django_models_外键应用

一、什么是主键,什么是外键 这是一个太老声长谈的问题,我认为 1、主键:在一个数据库表格中的唯一标识,因此主键有个重要的属性,是不能重复且唯一,且不能为空,比如说,一个班级里有两个学生叫张三,学生名子显然不能作为学生表格的主键,因为我一搜张三,就会有两个张三同时跳出来,那什么可以呢,就是学号,因为学号在班级里是唯一的。其他还有很多例子,比如说,身份证号,工号等等, 2、外键:A表中的一个字段,是B表的主键,那他就可以是A表的外键,同上,如果有一个学生成绩表,学号是学生成绩表中的一个字段,那学号就是学生

分享自己浅浅的知识 4142

深入解析SSD报错“READ FPDMA QUEUED”:从诊断到修复全流程

本文深入解析了SSD报错“READ FPDMA QUEUED”的含义、成因与全流程解决方案。该错误通常指示硬盘硬件或健康状态问题。文章详细介绍了如何通过系统日志定位错误、解读关键的S.M.A.R.T.健康报告(重点关注重分配扇区计数等指标),并逐步进行硬件排查(如更换SATA数据线)、软件修复与数据抢救,最终指导用户根据诊断结果做出维修或更换SSD的决策。

weixin_29233333的博客 399

Pytorch实现之SRGAN+CBAM的结构设计

在SRGAN的残差连接中加入了CBAM注意力机制,同时设计了四类损失来训练。

LJ1147517021的博客 571

Django 序列化含有外键的数据

发现问题 使用Django 自带的serialize可以方便的序列化数据库中的数据,但是不能处理外键和多对多关系。在dj自带的serialize序列化的数据中如果有外键的话,会自动使用主键进行序列化,不方便前端进行渲染。 解决方案 解决方案1 修改models,将需要显示的字段设置为自然键即可显示。但是这样不方便传送外键的全部属性。 # models.py def __str__(self): ...

qq_41764553的博客 4857

MATLAB基础应用精讲-【数模应用】信用评分模型(附R语言和python代码实现)

信用评分模型是近年来兴起的一种为了保障银行和其他金融部门的金融安全而设立的一种关于人身金融权限的划定模型。该模型指根据客户的信用历史资料,利用一定的信用评分模型,得到不同等级的信用分数,根据客户的信用分数,来决定客户所可以持有的金额权限,从而保证还款等业务的安全性。而随着在现代社会和公司中,贷款,信用卡的作用日渐突出,信用评分模型的发展前景不可估量。信贷风险是指借款人因偿还贷款或履行合同承诺而破产而产生损失的可能性。传统上,它与贷款人无法偿还所欠利息和本金、影响现金流和增加装配成本所产生的风险有关。

qq_36130719的博客 364

Django - 关于 models.py 模型的外键方法使用总结 - 1

目录一、如何构建模型外键1. app内的外键构建2. 跨app的外键构建二、外键约束 - 删除操作的参数配置三、多表外键绑定,起别名 - related_name1. 别名的实际应用 - 外键值查询 - 反向过滤器的搜索 一、如何构建模型外键 1. app内的外键构建 # app/models.py class App1(models.Model): pass class App2(models.Model): app2 = models.ForeignKey("App1", on_delet

Muxiu 2547

Open3D(C++) 读取、可视化并保存点云【2025最新版】

博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 4617

Vue3 - 超详细最新 wangEditor V5 富文本编辑器安装引入及使用教程,提供工具栏配置、基础富文本功能、API使用示例教程等(新手小白快速引入并植入到项目中)

vue3,wangEditorv5富文本编辑器,wangEditorv5官方文档,vue3最新安装wangEditorv5富文本详细使用教程,vue3使用wangEditorv5编辑器示例代码,vue3网站网页安装植入富文本编辑器教程,vue3wangEditor使用api,vue3安装富文本控制台出现报错如何解决,vue3wangEditor-v5工具栏配置,vue3中使用富文本编译器wangEditor5的方法,wangeditor5在vue3中的全使用过程,vue3超详细最新wangedi

🏆 前端领域优质创作者 4253

Django models 字段重命名、断外键

一、重命名字段名 1、创建一个空的migration文件 python manage.py makemigrations <app_name> --empty 2、 编辑生成的migration文件 from django.db import migrations class Migration(migrations.Migration): dependen...

xiaofuge027的博客 1971

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Django中使用外键

在 Mysql 中,表有两种引擎,一种是 InnoDB ,另一种是 myisam ,如果想要使用外键,需要使用 InnoDB 作为引擎。 在 Django 中,使用 models.ForeignKey(to,on_delete) 来声明外键,第一个参数表示引用了哪个模型,第二个参数设定使用外键引用的模型的数据被删除时的处理原则,如级联原则 CASCADE 和置空值原则 SET_NULL,下面创建...

Lechrondのblog 1125

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Django - 模型序列化返回自然主键值

场景 在设计表结构时,难免需要建立一些外键关联。例如这样两个模型: from django.db import models class Person(models.Model): username = models.CharField(max_length=100) birthdate = models.DateField() class Book(models.Model)...

weixin_34183910的博客 1642

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Django的ORM模型外键使用详解

外键和表关系 外键: 在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam。如果使用的是InnoDB引擎,是支持外键约束的。外键的存在使得ORM框架在处理表关系的时候异常的强大。 类定义为class ForeignKey(to,on_delete,**options)。第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段该如何处理,比如有C...

SGTXS的博客 979

Django如何创建指向同一个模型的多个外键?

如下所示的House模型,其”province“, "city"和"district"字段类型是指向Region模型的外键。 view plaincopy to clipboardprint? class Region(models.Model):       """行政区域表      国家,省,市,区(县)      """       parent

laiqun_ai的专栏 1万+

Django外键的删除

Django 1.3版本以后,对models外键进行了扩展,记得之前models的外键删除,都是级联删除的,举个例子好理解:Cateogry和Blog关系,Cateory有多个Blog,所以常常在Blog实体里新建一个category的外键,当我们删除一个Category的时候,归属该Category的所有Blog,同时都被删除了,这就是级联删除了。 有个题外话,Django的models和

helloworl的专栏 1422

django update和create外键时出现问题

数据如下,需要进行update和create操作, advertisement为外键,adsId为外键id if journal_id: journalad = JournalAd.objects.filter(id=journal_id).update(**(my_data_dict)) else: my_dat

bluewhale的专栏 4802

【后端】【django】【Django ORM】models.ForeignKey定义 外键(多对一关系)详解

(多对一关系)的字段类型。它提供了多种参数来控制数据库行为和 ORM 逻辑。是 Django ORM 用于定义。默认情况下,Django 反向查询用。这样,我们就掌握了 Django。在 Django Admin。在 Django Admin。的所有参数及用法 🚀。

qq_59344127的博客 1215

解决Django外键关联难题:Django-seed数据依赖处理最佳实践

Django-seed是一款强大的Django数据库填充工具,它能帮助开发者快速生成逼真的测试数据。对于新手开发者来说,处理模型间的外键关联常常是一个棘手的问题,而Django-seed通过内置的依赖解析机制,让这一过程变得简单高效。本文将详细介绍如何使用Django-seed解决外键关联难题,掌握数据依赖处理的最佳实践。 ## 🧩 认识Django模型关系类型 在深入使用Django-se

gitblog_00017的博客 961

django orm级联_19 Django 中 ORM 外键使用

Django 中 ORM 外键使用外键 (Foreign Key)是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的连接,这个列就成为第二个表的外键。外键的作用如下:保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,就是当你对一个表的数据进行操作,和他有关联的一个或更多表的数据能够同时发生改变。外键可...

weixin_28741707的博客 1310
上一篇: Django 小实例S1 简易学生选课管理系统 —— 三、创建用户模型(model)
下一篇: Django 小实例S1 简易学生选课管理系统 —— 四、实现登录页面
大爽歌
博客等级 码龄9年 422粉丝 92原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值