2016-07-22 75 views
0

我正试图在数据库(Django + PostgreSQL)上设计一个Inventory表,并且对于实现与其他多态关系的最“正确”方式表。在库存数据库上实现多态关联

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

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

我目前的想法是对于输入和输出都有尽可能多的字段选项(即idProductionOrder,idSalesOrder),并添加-NAND约束以避免两个字段同时包含数据。我认为这可能是一个实际的解决方案,但可能不是一个非常整齐的解决方案。有更好的方法吗?

回答

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的智能选择。