类继承
你可以使用类继承,比如
class Person(models.Model):
(fields)
# in other file, import this class an inherit
class PersonWithDetails(Person):
(add. fields)
编辑:根据multitable inheritance 上的docs,这将为PersonWithDetails 创建一个包含附加字段的附加表。但是,对于用户来说,似乎所有数据都存储在一个表中。例如,filter 和 update 查询按预期工作:
PersonWithDetails.objects.filter(<some criteria>)
将返回包含所有字段(来自 Person 和 PersonWithDetails)的实例,就好像所有字段都存储在单个表 PersonWithDetails 中一样。此外,可以选择所有人而不考虑他们的详细信息:
Person.objects.all()
将返回所有 Person 实例,包括那些已创建为 PersonWithDetails 的实例。如果你手头有一个 Person 实例p,那么你可以检查一个特殊属性是否存在,然后知道这个实例是否也是一个 PersonWithDetails:
if p.personwithdetails is not None:
p.personwithdetails.field_1
这个例子展示了如果手头的实例是 Person,如何访问 PersinWithDetails 的字段。
OneToOneField
另一种选择是使用one-to-one 关系。
class Person(models.Model):
(fields)
# in other file, import this class and do
class DetailsPerson(models.Model):
person = models.OneToOneField(Person, on_delete=models.CASCADE)
(additional fields)
如果要向 Person 类添加详细信息,我更喜欢第二种选择。
外键
如果您想为一个人设置多个不同的 Detail 类,请使用 ForeignKey:
class DetailsPerson1(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
(additional fields)
class DetailsPerson2(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
(additional fields)