MySQL 中的外键是一种关系型数据库特性,用于在两个表之间建立关联。外键定义了一个表中的列(或多列)与另一个表中的数据的关系,通常是通过主键和外键之间的关联。在 Django 的模型中,外键通过 models.ForeignKey 字段来表示。
主表和从表: 在两个表中,包含外键的表被称为主表,被引用的表是从表。
主键和外键: 主表中的列通常是主键,而从表中的列则是外键,它与主表的主键相对应。
定义外键:
在 Django 模型中,可以通过 models.ForeignKey 字段来定义外键models.ForeignKey 用于创建一个多对一(Many-to-One)的关系。它允许一个模型通过外键与另一个模型建立关联。在 MySQL 中,这通常通过在一个模型中存储另一个模型的主键来实现。
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
在这个例子中,我们有两个模型:Author 和 Book。Book 模型有一个外键 author,它与 Author 模型建立了关联。下面是一些关键概念:
ForeignKey 字段类型: models.ForeignKey 用于创建一个外键字段。它指定了与之关联的模型(这里是 Author)
on_delete 参数: 外键字段还有一个必需的参数 on_delete,它指定了在关联的对象被删除时采取的行为。常用的选项包括:
models.CASCADE: 当关联的对象被删除时,与之相关的所有对象也被删除。
数据库的级联删除
models.PROTECT: 阻止删除关联的对象,抛出 ProtectedError 异常。
models.SET_NULL: 将所有关联的外键字段设置为 NULL。要使用此选项,外键字段必须允许 NULL 值。
models.SET_DEFAULT: 将所有关联的外键字段设置为默认值。
models.SET(): 将所有关联的外键字段设置为特定的值。
models.DO_NOTHING: 什么都不做。
在上面的例子中,on_delete=models.CASCADE 表示当与之关联的 Author 对象被删除时,相关的 Book 对象也会被删除。
使用外键,你可以通过查询轻松地获取相关对象,例如:
# 获取某本书的作者
book = Book.objects.get(id=1)
author = book.author
这使得在数据库中建立和管理模型之间的关系变得更加容易。
related_name 是一个可选的参数,用于设置反向关系的名称。具体而言,它定义了从关联的模型反向查询时使用的名称。
class Article(models.Model):
column = models.ForeignKey(
ArticleColumn,
null=True,
blank=True,
on_delete=models.CASCADE,
related_name='article'
)
这里的 related_name='article' 意味着你可以通过 ArticleColumn 模型的实例直接访问与之相关的 ArticlePost 对象。例如,如果你有一个 column 实例,你可以使用 column.article.all() 获取与该栏目相关的所有文章。
my_column = ArticleColumn.objects.get(id=1)
related_articles = my_column.article.all()
这使得在模型之间进行反向查询更加方便,并且提供了更具有可读性的名称,而不是默认的 articlepost_set。
外键的作用:
维护数据一致性: 外键确保从表中的数据与主表中的数据保持一致,防止了不一致的情况。
建立关联: 外键建立了两个表之间的关联,使得它们在逻辑上形成了一种关系。
唯一性约束: 可以通过 unique=True 来指定外键是否唯一。
索引: 外键通常会自动创建索引,以提高查询性能。