在库存数据库上实现多态关联

时间:2016-07-22 02:36:42

标签: django database postgresql polymorphic-associations

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

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

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

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

1 个答案:

答案 0 :(得分:0)

我认为你要找的是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-choices。