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

news/2024/11/18 13:49:59/

Django model 外键的实现

主键: 在 Django 中,如果你没有显式地指定一个模型的主键,Django 会自动为其创建一个名为 “id” 的主键字段,这个字段是一个自增长的整数类型。因此,如果在 Author 模型中没有显式地指定主键,那么它的主键就是自动生成的 “id” 字段。

外键(ForeignKey):在 Django 中,表和表之间可以通过外键(ForeignKey)来进行关联。外键是一种将一个表中的字段与另一个表中的字段进行关联的方法。在 Django 中,外键通常定义在一个模型中,它指向另一个模型的主键(primary key),从而建立了两个模型之间的关系。

一对一关系(OneToOneField):一对一关系就是指一个模型实例只能与另一个模型实例相对应。在 Django 中,你可以使用 OneToOneField 来定义一对一关系。

多对多关系(ManyToManyField):多对多关系就是指一个模型实例可以与多个其他模型实例相对应,而一个其他模型实例也可以与多个该模型实例相对应。在Django 中,你可以使用 ManyToManyField来定义多对多关系。多对多关系通常需要通过一个中间表来实现,这个中间表记录了两个模型实例之间的对应关系。

联合主键(CompositeKey):联合主键是指将多个字段一起作为主键来唯一标识一个模型实例。在 Django 中,默认情况下不支持联合主键,但你可以使用第三方库来实现联合主键的功能。

  1. 外键(ForeignKey)

例如,如果有一个“作者”(Author)模型和一个“书籍”(Book)模型,你可以在“书籍”模型中定义一个外键,将其指向“作者”模型的主键。这样,每个书籍都可以与一个作者关联起来。

from django.db import modelsclass Author(models.Model):name = models.CharField(max_length=100)email = models.EmailField()class Book(models.Model):title = models.CharField(max_length=200)author = models.ForeignKey(Author, on_delete=models.CASCADE)

在这个示例中,Book 模型中的 author 字段是一个外键,它指向 Author 模型的主键。on_delete=models.CASCADE 参数表示,当一个作者被删除时,与之相关的所有书籍都将被删除(即级联删除)。这样,你就可以通过 Book 模型的 author 字段来访问与之关联的 Author 模型的数据。例如,如果你有一个 book 实例,你可以通过 book.author 来访问其关联的作者实例。

  1. 一对一关系(OneToOneField)

假设我们有两个模型:Person 和 Passport,每个人只有一个护照,每个护照只属于一个人,这就是一对一关系。在 Django
中,你可以使用 OneToOneField 来定义这种关系,例如:

from django.db import modelsclass Person(models.Model):name = models.CharField(max_length=100)class Passport(models.Model):number = models.CharField(max_length=20)person = models.OneToOneField(Person, on_delete=models.CASCADE)

在这个示例中,Passport 模型中的 person 字段是一个 OneToOneField,它指向 Person
模型。这样,每个护照都可以与一个人关联起来,而每个人也只有一个护照。

  1. 多对多关系(ManyToManyField)

假设我们有两个模型:Student 和 Course,一个学生可以选修多门课程,一门课程也可以被多个学生选修,这就是多对多关系。在Django 中,你可以使用 ManyToManyField 来定义这种关系,例如:

from django.db import modelsclass Student(models.Model):name = models.CharField(max_length=100)courses = models.ManyToManyField(Course)class Course(models.Model):name = models.CharField(max_length=100)

在这个示例中,Student 模型中的 courses 字段是一个 ManyToManyField,它指向 Course 模型。这样,每个学生可以选修多门课程,而每门课程也可以被多个学生选修。

  1. 联合主键(CompositeKey)

假设我们有一个模型:Order,它有两个字段:order_id 和 customer_id,这两个字段一起作为主键来唯一标识一个订单。在 Django 中,默认情况下不支持联合主键,但你可以使用第三方库来实现联合主键的功能,例如 django-composite-foreignkey。

from django.db import models
from compositefk.fields import CompositeForeignKeyclass Customer(models.Model):name = models.CharField(max_length=100)class Order(models.Model):order_id = models.IntegerField()customer = models.ForeignKey(Customer, on_delete=models.CASCADE)customer_id = models.IntegerField()class Meta:primary_key = CompositeKey('order_id', 'customer_id')

在这个示例中,Order 模型中的主键是 ‘order_id’ 和 ‘customer_id’ 两个字段的组合,我们使用了 django-composite-foreignkey 库中的 CompositeForeignKey 来定义了一个联合外键,将 customer 字段与 Customer 模型关联起来。这样,每个订单都可以唯一地由 ‘order_id’ 和 ‘customer_id’ 两个字段来标识。

  1. __str__函数
from django.db import modelsclass Author(models.Model):name = models.CharField(max_length=100)def __str__(self):return self.nameclass Book(models.Model):title = models.CharField(max_length=200)author = models.ForeignKey(Author, on_delete=models.CASCADE)def __str__(self):return self.title

__str__是一个 Python 中的特殊方法,用于确定对象的字符串表示形式。在 Django 模型中,__str__方法通常用于定义模型的人类可读表示形式,以便在管理界面和其他地方显示模型对象时使用。

在这个示例中,Book 模型包含一个外键字段,它指向 Author 模型。这个外键字段将 Book 模型与 Author 模型关联起来,并且指定了n_delete=models.CASCADE 参数,以确保当关联的作者记录被删除时,与之关联的书籍记录也被删除。

例如,如果我们在 Django 管理界面中查看一个名为 “John Doe” 的作者对象,它将显示为 “John Doe” 而不是默认的对象表示形式,如 <Author: Author object (1)>。

  1. 数据迁移
python manage.py makemigrations
python manage.py migrate

http://www.ppmy.cn/news/747118.html

相关文章

Guitar Pro8.1最新版吉他练习好助手

Guitar Pro研发团队深知「简谱」之于中国用户的重要性&#xff0c;在经过几个月的测试和开发&#xff0c;最新的Guitar Pro软件已全面支持简谱功能&#xff01;会带给您音乐学习和创作的极大便利。相信玩吉他的朋友多多少少都听说过Guitar Pro这款软件&#xff0c;那大家知道Gu…

图像超分辨率:小米低功耗超分,适用于移动端Extreme Low-Power Super Resolution Network For Mobile Devices

4. ELSR: Extreme Low-Power Super Resolution Network For Mobile Devices 小米的论文&#xff0c;网络很简单很快&#xff0c;训练步骤比较多。

android mi4 分辨率,小米4的屏幕尺寸是多少?小米4的分辨率是多少?

小米4的屏幕尺寸是多少 小米4的屏幕尺寸是5英寸。 针对小米4的屏幕尺寸是多少的问题&#xff0c;屏幕方面&#xff0c;小米4屏幕采用5英寸夏普和JDI屏&#xff0c;OGS全贴合工艺&#xff0c;并称NTSC色域比iPhone 5s更高。支持自动识别湿手和手套模式。还有边缘防误触专利技术&…

android mi4 分辨率,小米4c的屏幕尺寸是多少?小米4c的分辨率是多少?

小米4c的屏幕尺寸是多少 小米4c的屏幕尺寸是5英寸。 针对小米4c的屏幕尺寸是多少的问题&#xff0c;小米4c配备了3080mAh(4.4V高电压)电池&#xff0c;支持快充2.0&#xff0c;采用了USB Type-C接口&#xff0c;正反都能插&#xff0c;也成为了首款采用USB Type-C接口的小米手机…

mysql创建表练习

CREATE TABLE student ( Id int(10) primary key auto_increment comment "学号", Name varchar(20) not null comment "姓名", Sex enum(M,F) default M comment "性别", Birth year(4) comment "出生年份", Department varchar(20)…

Go语言程序设计(四)数组

一、数组的声明 在声明数组时,必须指定数组名、数组长度和数组类型,格式如下&#xff1a; var arrayName [arraySize] dataType 说明&#xff1a; (1)数组名的命名规则和变量名相同,遵循标识符命名规则。(2)在定义数组时,需要指定数组中元素的个数,即数组长度。例如,a[5]int…

6、架构:组件与物料设计

本章节主要是物料组件的开发设计&#xff0c;之前提到了物料的结构与构成&#xff0c;但是并没有做明确的解释。作为低代码编辑器中核心的模块之一。 物料即承担了一个提供者的角色&#xff0c;通过对编辑器注入物料组件来完成页面的渲染和可视化编辑器的编排&#xff0c;最终…

恩智浦 飞思卡尔Freescale Kinetis KEA128学习笔记1------环境和IDE工具

从keil官网上下了Keil uVision5&#xff0c;并从其官网上下了对应的芯片支持包NXP Keil.Kinetis_KEAxx_DFP.1.3.0.pack 所有的资料包上传到了百度云 Keil uVision5MDKKeil51破解工具型号包 链接: https://pan.baidu.com/s/1B6CxjESeUzTBtJ6CNUeL4g 提取码: 73my