【问题标题】:Best approach to model contacts in the Django modelling language在 Django 建模语言中建模联系人的最佳方法
【发布时间】:2016-02-02 16:52:58
【问题描述】:

我正在设计一个需要分组存储联系人的联系人关系应用程序。基本上我有 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')

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

有没有更好的方法来模拟这样的关系?我使用抽象类完全错误吗?

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

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

【问题讨论】:

  • 子组有额外的字段还是只是他们的逻辑发生了变化?
  • 不,他们没有任何额外的字段

标签: django django-models django-orm


【解决方案1】:

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

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

group = ForeignKey(BaseGroup)

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

更多关于模型继承in the doc

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-08-30
      • 2018-09-16
      • 2011-09-15
      • 2011-10-26
      • 2010-12-28
      • 2010-12-14
      • 2011-04-17
      • 2012-04-25
      • 1970-01-01
      相关资源
      最近更新 更多