创建具有关系的模型
多对一的关系
from django.db import models
class Author(models.Model):
   name = models.CharField(max_length=50)
#Book has a foreignkey (many to one) relationship with author
class Book(models.Model):
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    publish_date = models.DateField()
最通用的选择。可以在任何想要代表关系的地方使用
多对多关系
class Topping(models.Model):
    name = models.CharField(max_length=50)
# One pizza can have many toppings and same topping can be on many pizzas
class Pizza(models.Model):
    name = models.CharField(max_length=50)
    toppings = models.ManyToManyField(Topping)
在内部,这通过另一个表来表示。ManyToManyField 应该放在将在表单上编辑的模型上。例如:Appointment 将有一个叫 Customer 的 ManyToManyField,Pizza 有 Toppings 等等。
使用 Through 类的多对多关系
class Service(models.Model):
     name = models.CharField(max_length=35)
class Client(models.Model):
    name = models.CharField(max_length=35)
    age = models.IntegerField()
    services = models.ManyToManyField(Service, through='Subscription')
class Subscription(models.Model):
     client = models.ForeignKey(Client)
     service = models.ForeignKey(Service)
     subscription_type = models.CharField(max_length=1, choices=SUBSCRIPTION_TYPES)
     created_at = models.DateTimeField(default=timezone.now)
这样,我们实际上可以保留关于两个实体之间关系的更多元数据。可以看出,客户端可以通过多种订阅类型订阅多个服务。在这种情况下唯一的区别是,为了向 M2M 关系添加新实例,不能使用快捷方法 pizza.toppings.add(topping),而是应该创建通类的新对象,Subscription.objects.create(client=client, service=service, subscription_type='p')
在其他语言中,
through tables也被称为JoinColumn,Intersection table或mapping table
一对一的关系
class Employee(models.Model):
   name = models.CharField(max_length=50)
   age = models.IntegerField()
   spouse = models.OneToOneField(Spouse)
class Spouse(models.Model):
   name = models.CharField(max_length=50)
当你在两个模型之间只有组合关系时,请使用这些字段。