📜  Python| Django 模型中的关系字段(1)

📅  最后修改于: 2023-12-03 15:34:14.811000             🧑  作者: Mango

Python | Django 模型中的关系字段

Django 是 Python 的一个 Web 框架,它的模型系统提供了多个关系字段用于建立模型之间的关联关系。本文将深入介绍 Django 中的关系字段。

一对一关系
from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=30)

class Contact(models.Model):
    person = models.OneToOneField(Person, on_delete=models.CASCADE)
    email = models.EmailField()

上面的代码中,Contact 模型与 Person 模型是一对一关系。OneToOneField 表示该字段建立了一个唯一的一对一关系,on_delete=models.CASCADE 表示在对应的 Person 实例被删除时,与之相关的 Contact 实例也会被删除。

一对多关系
from django.db import models

class Manufacturer(models.Model):
    name = models.CharField(max_length=255)

class Car(models.Model):
    manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)
    name = models.CharField(max_length=255)

上面的代码中,Car 模型与 Manufacturer 模型是一对多关系。ForeignKey 表示该字段建立了一个外键关联,on_delete=models.CASCADE 同样表示在对应的 Manufacturer 实例被删除时,与之相关的 Car 实例也会被删除。

多对多关系
from django.db import models

class Customer(models.Model):
    name = models.CharField(max_length=255)

class Product(models.Model):
    name = models.CharField(max_length=255)

class Order(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
    products = models.ManyToManyField(Product)

上面的代码中,Order 模型与 Customer 模型、Product 模型是多对多关系。ManyToManyField 表示该字段建立了一个多对多关系,products 表示在 Order 模型中与 Product 模型相关的字段。

反向关系

在上面的例子中,我们只定义了一方的关系字段。Django 会自动地在相关的模型上创建反向关系。例如,在 Car 模型中,我们定义了 manufacturer 字段,但是 Manufacturer 模型中并没有定义任何字段,但是我们依然可以通过 car.manufacturer 访问到对应的 Manufacturer 实例。反向关系可以通过 related_name 参数自定义名称。

from django.db import models

class Manufacturer(models.Model):
    name = models.CharField(max_length=255)

class Car(models.Model):
    manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE, related_name="cars")
    name = models.CharField(max_length=255)

在上面的代码中,我们将 related_name 参数设置为 cars,这样在 Manufacturer 模型中就可以通过 manufacturer.cars.all() 访问到与之相关的所有 Car 实例。

以上就是 Django 中常用的关系字段。这些关系字段使得模型建立关联关系变得简单易懂,也使得访问关联数据变得方便。在实际的应用中,我们可以根据实际情况选择合适的关系字段来建立模型之间的关联关系。