Django: Как сделать так, чтобы родительский класс имел только один дочерний экземпляр

Это теоретический вопрос, который я хочу применить к своему собственному исследованию. Однако, скажем, у меня есть три модели:

class Person(models.Model)
   first_name = models.CharField(max_length=100)
   last_name = models.CharField(max_length=100)

class Teacher(Person)
   teacher_id = models.IntegerField()

class Student(Person)
   student_id = models.IntegerField()

Какие ограничения базы данных/модели я могу установить, чтобы гарантировать, что экземпляр обоих детей не может быть создан с одним и тем же Person родителем.

Кроме того, возможно, я использовал не самый лучший пример, но предположим, что Person также может быть создан явно.

Примечание: Очевидно, что я могу поставить небольшую проверку при сохранении, но я надеялся на что-то более "питоническое"

.

Как вы описали модели выше, вам не нужно добавлять явное ограничение для проверки того, что экземпляр из обоих дочерних элементов не может быть создан с одним и тем же Person родителем.

Потому что : Teacher и Student также являются объектами Person. Это многотабличное наследование.

Давайте проверим это

from app_name.models import Person, Teacher, Student

p1 = Person.objects.create(first_name='name1', last_name='name2')
p1.id
# output -> 1

t1 = Teacher.objects.create(first_name='name1', last_name='name2', teacher_id=1)
t1.id
# output -> 2 (The previous person id + 1)

s1 = Student.objects.create(first_name='name1', last_name='name2', student_id=1)
s1.id
# output -> 3 (The previous person, because student is a person 2 + 1 = 3)

Как вы видите, все дети-персоны разные Pk. Потому что все они одинаковые Person object

Вернуться на верх