django model 外键

django2024-09-08268

在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中处理数据库关系变得简单而直观。