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