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

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 models

class 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 models

class 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 models

class 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 CompositeForeignKey

class 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 models

class Author(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

class 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
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的铁甲小宝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值