在Django建模语言中建模联系的最佳方法

时间:2016-02-02 16:52:59

标签: django django-models django-orm

我正在设计一个需要在群组中存储联系人的联系人关系应用程序。基本上我有7"组类型" (对于我的图像将其简化为3),每个组类型共享相同的字段,因此我认为使用抽象"组"是有意义的,并且让所有组类型继承此抽象组中的方法。

所以这基本上就是这个想法:

Group type A

然而,这种方法会导致一些意想不到的困难。例如:

我无法使用抽象类的外键,所以如果我想模拟组和联系人之间的关系,我必须使用以下方法:

limit = (models.Q(app_label='groups', model="Group type A") |
         models.Q(app_label='groups', model="Group type B") |
         models.Q(app_label='groups', model="Group type C")
         )
group_type = models.ForeignKey(ContentType, limit_choices_to=limit)
group_id = models.PositiveIntegerField()
group = GenericForeignKey('group_type', 'group_id')

这看起来相当hacky,并且通过这种方法我也不得不做一些硬编码。我无法通过简单的查询呼叫所有组,将来可能会添加一个新组。

有没有更好的方法来建立这样的关系?我使用抽象类完全错了吗?

修改:回答问题的一些额外解释。 用户使用名为" WorkRelation"的另一个对象连接到一个组,因为在将用户分配给一个组时(例如他的功能),有一些额外的数据是相关的。

我最初选择了一个抽象类,因为我认为这样可以让我灵活地让所有Group类型只调用Group.objects.all()。如果我使用基本模型,这些组都没有连接,我还必须对所有组名进行硬编码。

2 个答案:

答案 0 :(得分:2)

由于您的子模型没有其他字段,因此您可以将它们设为基本组模型的proxy models。代理模型不会创建新的数据库表,它们只允许在同一个表上使用不同的编程接口。

然后,您可以将ForeignKey定义为基本群组模型:

group = ForeignKey(BaseGroup)

使用django-polymodels或类似的应用在查询时将这些组投放到正确的类型。

有关模型继承的更多信息in the doc

答案 1 :(得分:0)

为什么不使用固体基础模型而不是抽象模型?然后,您只需将contacts作为ForeignKeyManyToMany添加到基本模型。