Django model 外键的实现
主键: 在 Django 中,如果你没有显式地指定一个模型的主键,Django 会自动为其创建一个名为 “id” 的主键字段,这个字段是一个自增长的整数类型。因此,如果在 Author 模型中没有显式地指定主键,那么它的主键就是自动生成的 “id” 字段。
外键(ForeignKey):在 Django 中,表和表之间可以通过外键(ForeignKey)来进行关联。外键是一种将一个表中的字段与另一个表中的字段进行关联的方法。在 Django 中,外键通常定义在一个模型中,它指向另一个模型的主键(primary key),从而建立了两个模型之间的关系。
一对一关系(OneToOneField):一对一关系就是指一个模型实例只能与另一个模型实例相对应。在 Django 中,你可以使用 OneToOneField 来定义一对一关系。
多对多关系(ManyToManyField):多对多关系就是指一个模型实例可以与多个其他模型实例相对应,而一个其他模型实例也可以与多个该模型实例相对应。在Django 中,你可以使用 ManyToManyField来定义多对多关系。多对多关系通常需要通过一个中间表来实现,这个中间表记录了两个模型实例之间的对应关系。
联合主键(CompositeKey):联合主键是指将多个字段一起作为主键来唯一标识一个模型实例。在 Django 中,默认情况下不支持联合主键,但你可以使用第三方库来实现联合主键的功能。
- 外键(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 来访问其关联的作者实例。
- 一对一关系(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
模型。这样,每个护照都可以与一个人关联起来,而每个人也只有一个护照。
- 多对多关系(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 模型。这样,每个学生可以选修多门课程,而每门课程也可以被多个学生选修。
- 联合主键(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’ 两个字段来标识。
- __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)>。
- 数据迁移
python manage.py makemigrations
python manage.py migrate