You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:05:15