我正在设计一个需要在群组中存储联系人的联系人关系应用程序。基本上我有7"组类型" (对于我的图像将其简化为3),每个组类型共享相同的字段,因此我认为使用抽象"组"是有意义的,并且让所有组类型继承此抽象组中的方法。
所以这基本上就是这个想法:
然而,这种方法会导致一些意想不到的困难。例如:
我无法使用抽象类的外键,所以如果我想模拟组和联系人之间的关系,我必须使用以下方法:
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()。如果我使用基本模型,这些组都没有连接,我还必须对所有组名进行硬编码。
答案 0 :(得分:2)
由于您的子模型没有其他字段,因此您可以将它们设为基本组模型的proxy models。代理模型不会创建新的数据库表,它们只允许在同一个表上使用不同的编程接口。
然后,您可以将ForeignKey
定义为基本群组模型:
group = ForeignKey(BaseGroup)
使用django-polymodels或类似的应用在查询时将这些组投放到正确的类型。
有关模型继承的更多信息in the doc。
答案 1 :(得分:0)
为什么不使用固体基础模型而不是抽象模型?然后,您只需将contacts
作为ForeignKey
或ManyToMany
添加到基本模型。