【问题标题】:Django: How to ensure a parent class only has one child instanceDjango:如何确保父类只有一个子实例
【发布时间】:2022-01-05 14:33:59
【问题描述】:

这是一个理论问题,我想将其重新应用到我自己的研究中。但是,假设我有三个模型:

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 也可以显式创建。

注意:显然我可以在保存时做一个小检查,但希望得到更“Pythonic”的东西

更新(进一步定义)

注意:这只是为了证明孩子可以共享同一个父母。

假设我们有一个Person

>>> person = Person.objects.create(first_name="Joe", last_name="Bloggs")
>>> person
<Person: Person object (1)>

然后我们创建一个Student

>>> student = Student.objects.create(first_name="Joe", last_name="Bloggs", student_id=1234)
>>> student
<Student: Student object (1)>

同时创建一个Teacher

>>> teacher = Teacher.objects.create(first_name="Joe", last_name="Bloggs", teacher_id=12)                                           
>>> teacher                 
<Teacher: Teacher object (1)>

我可以将教师和学生都分配给人员实例。像这样:

>>> person.teacher = teacher
>>> person.student = student
>>> person.student
<Student: Student object (7)>
>>> person.teacher
<Teacher: Teacher object (7)>

在某些情况下,Student 也可能是 Teacher。但是,在我的特定场景中,Person 不能同时是 StudentTeacher

【问题讨论】:

  • @Sumithran 在哪里?我没有其他模特/关系。
  • 从老师到人,学生到人等等

标签: python mysql django django-models


【解决方案1】:

正如您在上面描述的模型,您不必添加显式限制 检查是否不能使用相同的Person 父级创建来自两个子级的实例。

因为: TeacherStudent 也是 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)

如您所见,所有 Person 孩子都不同 Pk。因为都是一样的Person object

【讨论】:

  • 感谢您的回答,我在问题中提供了更多详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 2013-05-21
  • 2020-04-20
  • 2017-10-01
  • 2021-11-18
相关资源
最近更新 更多