Измените функциональность по умолчанию одной модели в отношении один-ко-многим в Django Admin - PullRequest
0 голосов
/ 20 июня 2020

У меня отношение «один ко многим».

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)

Когда я go в ученике в Django Admin, у меня появляется раскрывающийся список, и я могу выбрать своего Учителя. Это хорошо. Однако когда я go в Учителе, вместо выпадающего списка учеников, я получаю кнопку «Добавить другого пользователя» с выпадающим списком всех пользователей. Щелчок по студенту и нажатие кнопки «Сохранить» вызывает следующую ошибку:

Student with this User already exists.

Как я могу удалить «Добавить другого пользователя» со страницы учителя и заменить его раскрывающимся списком всех учеников (или учеников, которые не были назначен Учитель)?

Спасибо.

1 Ответ

0 голосов
/ 20 июня 2020

когда я go нахожусь в Учителе, вместо выпадающего списка учеников я получаю кнопку «Добавить другого пользователя» с раскрывающимся списком всех пользователей.

Да, это правильно, потому что имя переменной ученика недоступно для использования в поле класса Учителя. Если вы определяете классы, на которые ссылаются вверху, вам нужно использовать строку (например, «Студент»); однако внешний ключ определяется только на одной стороне отношения.

Один из вариантов, который вы можете использовать, - ManyToManyField, у вас будет три класса, и один из классов использует through поле. Вам необходимо определить самореферентные ForeignKeys путем определения иерархических структур, в классе User используйте строку self.

...