如何在Django中建立School与Director两个模型的关联?
Django模型双向关联正确实现方案
原代码存在的问题
- Director模型的
school字段使用CharField无法实现关联,需改用Django的关联字段 - 模型类名
school未遵循大驼峰命名规范(应改为School) ForeignKey缺少必填的on_delete参数related_name包含空格,不符合Django语法要求IntegerField和BooleanField不需要max_length参数
方案一:一对一关联(推荐,符合常规业务场景)
一个学校对应一个校长、一个校长仅负责一所学校,用OneToOneField实现双向关联最合理。
from django.db import models class Director(models.Model): created_at = models.DateTimeField(auto_now_add=True) first_name = models.CharField(max_length=50, verbose_name='Name') last_name = models.CharField(max_length=50, verbose_name='Surname') # 用OneToOneField关联School,指定级联删除策略 school = models.OneToOneField('School', on_delete=models.CASCADE, related_name='director', verbose_name='所属学校') photo = models.ImageField(upload_to="uploads/img/", max_length=10000, verbose_name='photo') birthday = models.DateField(verbose_name='birthday') # 自定义属性返回校长全名 @property def full_name(self): return f"{self.first_name} {self.last_name}" def __str__(self): return self.full_name class School(models.Model): created_at = models.DateTimeField(auto_now_add=True) name = models.CharField(max_length=50, verbose_name='name') capacity = models.IntegerField(verbose_name='capacity') registration_is = models.BooleanField(verbose_name='Registration') def __str__(self): return self.name
使用示例
- 获取学校对应的校长全名:
school.director.full_name - 获取校长对应的学校名称:
director.school.name
方案二:一对多关联(适用于一个校长管理多所学校的场景)
如果业务允许一位校长负责多所学校,用ForeignKey实现:
from django.db import models class Director(models.Model): created_at = models.DateTimeField(auto_now_add=True) first_name = models.CharField(max_length=50, verbose_name='Name') last_name = models.CharField(max_length=50, verbose_name='Surname') photo = models.ImageField(upload_to="uploads/img/", max_length=10000, verbose_name='photo') birthday = models.DateField(verbose_name='birthday') @property def full_name(self): return f"{self.first_name} {self.last_name}" def __str__(self): return self.full_name class School(models.Model): created_at = models.DateTimeField(auto_now_add=True) name = models.CharField(max_length=50, verbose_name='name') capacity = models.IntegerField(verbose_name='capacity') registration_is = models.BooleanField(verbose_name='Registration') # 用ForeignKey关联Director,指定反向关联名称 director = models.ForeignKey(Director, on_delete=models.CASCADE, related_name='managed_schools', verbose_name='校长') def __str__(self): return self.name
使用示例
- 获取学校对应的校长全名:
school.director.full_name - 获取校长管理的所有学校名称:
[school.name for school in director.managed_schools.all()]
内容的提问来源于stack exchange,提问作者Roberto-0F
相关产品推荐
相关产品推荐

