django foreignKey指的是多个表

时间:2016-10-03 12:06:03

标签: django python-3.x

我有两个型号。父母和孩子。因为孩子和父母有一些不同的领域,我不得不将他们分开,而不是只有一个模范人。 因为一个孩子应该有一个父亲和一个母亲,我有两个独立的父亲和母亲在不同的模型。 到目前为止:

 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等? thnx提前

2 个答案:

答案 0 :(得分:1)

我相信你可以在这种情况下使用GenericForeignKey。它是什么以及如何使用它您可以从文档中找到: https://docs.djangoproject.com/ja/1.10/ref/contrib/contenttypes/#module-django.contrib.contenttypes

答案 1 :(得分:1)

您可以创建抽象模型,例如HumanAbstract

class HumanAbstract(models.Model):
    class Meta:
        abstract = True

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

然后您的FatherMotherChild可以从HumanAbstract继承。由于在Meta HumanAbstract中有abstract = True,因此无法在数据库中创建。

Docs关于抽象类。

此外,您可以删除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')
    ...