【问题标题】:Implementing polymorphic associations on an inventory database在库存数据库上实现多态关联
【发布时间】:2016-07-22 02:36:42
【问题描述】:

我正在尝试在数据库 (Django + PostgreSQL) 上设计一个 Inventory 表,但我怀疑哪种方法是实现与其他表的多个多态关系的最“正确”方式。

基本上,每个条目都需要有一个input 字段,该字段可以引用一组表中的任何一个:例如,可能已经购买了一个产品(因此该字段应该是PurchaseOrder 的外键表),或者它可能已经生产/制造(即ProductionOrder)。同样,它最终会有一个output,例如,它可以指代SalesOrder(如果产品已售出)或另一个ProductionOrder(如果它用于制造其他东西)。

当然,单个外键字段不能引用不同表中的条目,那么实现这一点的最佳方法是什么?我阅读了类似问题的答案,但这些建议似乎不太适合这种情况。创建中间表似乎不合适,因为销售订单和生产订单不属于同一个“超集”,至少对我来说是这样。

我目前的想法是为输入和输出提供尽可能多的字段(即idProductionOrderidSalesOrder),并添加一个 -NAND- 约束以避免两个字段同时包含数据。我认为这可能是一个实用的解决方案,但可能不是一个非常简洁的解决方案。有更好的方法吗?

【问题讨论】:

    标签: django database postgresql polymorphic-associations


    【解决方案1】:

    我认为您正在寻找的是 GenericForeignKey 字段。这可以指向不同的模型。这是一个基于您输入的示例:

    class YourModel(models.Model):
        limit = (models.Q(app_label = 'YourApp', model = 'ProductionOrder') |
                 models.Q(app_label = 'YourApp', model = 'SalesOrder ')  |
                 models.Q(app_label = 'YourApp',model = 'ProductionOrder '))
    
        content_type = models.ForeignKey(ContentType, limit_choices_to = limit)
        object_id = models.PositiveIntegerField()
        content_object = GenericForeignKey('content_type', 'object_id')
    

    docu

    如果您希望它们很好地集成到管理员中,您还应该考虑使用 django-smart-selects。

    【讨论】:

      猜你喜欢
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 2013-09-02
      • 2011-03-02
      相关资源
      最近更新 更多