django model 外键
在Django的模型中,外键(ForeignKey)是一种关系字段,它表示两个模型之间的“一对多”关系。一个模型中的外键字段会指向另一个模型的实例,从而建立两个模型之间的关联。
定义外键
要在Django模型中定义外键,你需要使用django.db.models.ForeignKey
类。以下是一个简单的例子,说明如何定义外键:
from django.db import models class Author(models.Model): name = models.CharField(max_length=100) class Book(models.Model): title = models.CharField(max_length=100) author = models.ForeignKey(Author, on_delete=models.CASCADE) def __str__(self): return self.title
在这个例子中,Book
模型有一个名为author
的外键字段,它指向Author
模型的一个实例。on_delete=models.CASCADE
参数指定了当被关联的Author
对象被删除时,所有与之关联的Book
对象也会被级联删除。
外键的其他参数
on_delete
:这是一个必需的参数,它指定了当被关联的对象被删除时,这个字段应该如何处理。除了CASCADE
(级联删除)之外,还有其他选项,如SET_NULL
(将外键字段设置为NULL
,前提是该字段允许NULL
值)、SET_DEFAULT
(将外键字段设置为默认值,前提是该字段有默认值)等。related_name
:这个可选参数用于定义从关联对象反向查询到当前对象的属性名。默认情况下,Django会生成一个自动的反向查询名(如book_set
),但你可以通过related_name
自定义这个名称。related_query_name
:这个可选参数用于自定义反向查询时的查询集名称。to_field
:这个可选参数用于指定被关联模型中的哪个字段作为外键的目标。默认情况下,Django会使用被关联模型的主键字段。
反向查询
一旦你定义了外键,Django就会自动为关联模型提供反向查询的功能。你可以使用前面提到的related_name
来定制这个反向查询的属性名,如果没有指定related_name
,Django会默认使用模型名的小写形式加上_set
后缀(例如book_set
)。
author = Author.objects.get(name="John Doe") books = author.book_set.all() # 假设没有使用related_name # 如果使用了related_name class Book(models.Model): title = models.CharField(max_length=100) author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name="books") author = Author.objects.get(name="John Doe") books = author.books.all() # 使用related_name
通过外键,Django使得在ORM中处理数据库关系变得简单而直观。