【问题标题】:Change Default Functionality Of 'One' Model In One-To-Many Relationship In Django Admin在 Django Admin 的一对多关系中更改“一个”模型的默认功能
【发布时间】:2020-06-20 10:00:55
【问题描述】:

我有一对多的关系。

class User(AbstractUser):
    user_type = models.CharField(choices=USER_TYPES, max_length=255, default='student')

class Teacher(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    
class Student(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE, related_name='students', default=None, null=True)

当我在 Django Admin 中进入 Student 时,我有一个下拉框,可以选择他们的老师。这很好。但是,当我进入教师时,而不是学生的下拉框,我得到一个“添加另一个用户”按钮,其中包含所有用户的下拉列表。单击学生并按“保存”会引发以下错误

Student with this User already exists.

如何从教师页面中删除“添加其他用户”并将其替换为所有学生(或尚未分配教师的学生)的下拉列表?

谢谢。

【问题讨论】:

    标签: python django django-models django-admin


    【解决方案1】:

    当我进入教师,而不是学生的保管箱,我得到一个 带有所有用户下拉列表的“添加另一个用户”按钮。

    是的,这是正确的,因为学生变量名称不可用于教师类的字段。如果定义在顶部引用的类,则需要使用字符串(例如,'Student');但是,外键只定义在关系的一侧。

    您可以使用的选项之一是ManyToManyField,您将拥有三个类,其中一个类使用through 字段。您需要通过定义层次结构来定义自引用ForeignKeys,在User类中,使用字符串self.

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-25
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 2021-05-31
    • 2013-04-12
    相关资源
    最近更新 更多