通过模型的抽象模型

时间:2015-08-10 22:05:57

标签: python django django-models django-orm

我有一个抽象模型:

@Bean
@Transformer(inputChannel="requestChannel", outputChannel="replyChannel")
public ContentEnricher contentEnricher() {
    ContentEnricher contentEnricher = new ContentEnricher();
    Map<String, Expression> propertyExpressions = new HashMap<String, Expression>();
    propertyExpressions.put("description", new SpelExpressionParser().parseExpression("'enriching description with static string'"));
    contentEnricher.setPropertyExpressions(propertyExpressions );
    return contentEnricher;
}

和继承它的2个模型:

class Distributor(models.Model):

    class Meta:
        abstract = True

我也有一个llink模型:

class DistributorGroup(Distributor):
    pass

class DistributorPerson(Distributor):
    pass

链接可以与其中一个分销商建立关系。我通过添加2 m2m并将class Link(models.Model): distributors_persons = models.ManyToManyField( 'people.DistributorPerson', blank=True, related_name='distributors_persons_of_links') distributors_groups = models.ManyToManyField( 'groups.DistributorGroup', blank=True, related_name='distributors_groups_of_links') 设置为两者来完成此行为。

现在我意识到我需要一个blank=True模型来连接throughDistributor。但由于Link模型不能将抽象模型作为外键,我不知道该怎么做。我是否需要为throughthrough创建2个单独的DistributorPerson模型,或者有一种方法可以使用1 DistributorGroup模型完成此操作。另外,我不知道through模型中的2 m2m是否是实现我想要的行为的正确方法。

所以我想知道用抽象模型组织这些m2m模型的方法是什么。

1 个答案:

答案 0 :(得分:2)

第一个问题是DistributorPersonDistributorGroup是否真的需要是单独的表格。如果它们非常相似,那么仅使用一个表可能是有意义的。 (例如,如果您对电话号码建模,您可能不会使用单独的Home,Work和Mobile表格,而是使用带有类型字段的单个表格。)

(请注意,您可以使用proxy models允许不同的Django模型共享同一个数据库表。)

如果您确实需要单独的表格,那么您可以查看GenericForeignKey。这是一种允许外键引用不同模型类型的对象的机制。在您的情况下,这可能看起来像:

class DistributorGroup(Distributor):
    distributor_links = GenericRelation(DistributorLink, related_query_name="distributor_groups")

class DistributorPerson(Distributor):
    distributor_links = GenericRelation(DistributorLink, related_query_name="distributor_persons")

class Link(models.Model):
    pass

class DistributorLink(models.Model):
    link = models.ForeignKey(Link);

    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

有关示例和详细信息,请参阅generic relations上的文档。

最后,如果所有其他方法都失败了,你确实可以为这两种关系创建两个单独的M2M表。

请注意,这些都与抽象模型无关。抽象模型只是Django中代码重用的一种机制,它们不会影响表格或在它们上运行的查询。