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

Best approach to model contacts in the Django modelling language

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

所以这就是基本的想法:

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

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

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')

这看起来很老套,使用这种方法我也不得不进行一些硬编码。我无法通过简单的查询调用所有组,也许以后会添加新的组。

有没有更好的方法来模拟这样的关系?我使用的摘要 class 完全错误吗?

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

我最初选择了抽象 class,因为我认为这将使我能够灵活地让所有组类型都只调用 Group.objects.all()。如果我使用基本模型,则组不会连接,我还必须对所有组名进行硬编码。

为什么不使用实体基础模型而不是抽象模型?然后你只需将 contacts 作为 ForeignKeyManyToMany 放入基本模型。

由于您的子模型没有附加字段,您可以将它们设为 proxy models 基本组模型。代理模型不会创建新的数据库 table,它们只允许在相同的 table.

上具有不同的编程接口

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

group = ForeignKey(BaseGroup)

使用 django-polymodels 或类似的应用程序在查询时将组转换为正确的类型。

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