Django 外键引用多个表

3

我有两个模型:父母和孩子。由于孩子和父母的某些字段不同,我必须将它们分开而不是使用一个单一的人员模型。 因为一个孩子应该有一个父亲和一个母亲,所以我在不同的模型中有两个独立的父亲和母亲。 到目前为止:

 class Father(models.Model):
    name = models.CharField(max_length=50)
    ...
 class Mother(models.Model):
    name = models.CharField(max_length=50)
    ...
 class Child(models.Model):
    name = models.CharField(max_length=50)
    ...
    father=models.ForeignKey(Father)
    mother...

它应该设计得更好,但我不是专业人士。

现在我需要另一个健康模型。是否有可能有一个模型,其中字段属于子女、父亲或母亲?还是我应该为每个人创建一个健康模型,例如childhealth,fatherhealth等? 提前感谢。


1
看一下Django通用关系,也许它可以帮助你。 - devxplorer
2个回答

1

对于那些给这个问题点踩的人来说,问题是“是否可能拥有一个模型,其中字段属于孩子、父亲或母亲?还是我应该为每个健康状况创建一个像childhealth、fatherhealth等的模型?” - Sergei Zherevchuk

1
你可以创建抽象模型,例如 HumanAbstract
class HumanAbstract(models.Model):
    class Meta:
        abstract = True

    name = models.CharField(max_length=50)
    rest_common_fields = ...

然后你的FatherMotherChild可以继承自HumanAbstract。由于在MetaHumanAbstractabstract = True,它不会被创建在数据库中。

文档关于抽象类的内容。

此外,你可以消除FatherMother模型,只创建Parent模型。

class Parent(HumanAbstract):
    pass

class Child(HumanAbstract):
    father = models.ForeignKey(Parent)
    mother = models.ForeignKey(Parent)
    ...

更新

@SergeyZherevchuk关于GenericForeignKey的观点是正确的,您可以简单地集成它,这将是最佳选择。

class HealthModel(models.Model):
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接