我试图在数据库(Django + PostgreSQL)上设计一个Inventory
表,我怀疑哪个是最正确的"正确的"与其他表实现多种多态关系的方法。
基本上,每个条目都需要有一个input
字段,该字段可以引用一组表中的任何一个:例如,可以购买产品(因此该字段应该是{的外键) {1}}表),或者它可能已经生产/制造(即PurchaseOrder
)。同样,它最终会有一个ProductionOrder
,例如,可以引用output
(如果产品已售出)或另一个SalesOrder
(如果它用于制造另一件事)
当然,单个外键字段不能引用不同表中的条目,那么实现此目的的最佳方法是什么?我阅读了类似问题的答案,但这些建议似乎并不适合这样的案例。创建中间表似乎不合适,因为销售和生产订单不属于同一个"超集",至少对我而言。
我当前的想法是为输入和输出提供尽可能多的字段选项(即ProductionOrder
,idProductionOrder
),并添加-NAND-约束以避免两个字段同时包含数据。我认为这可能是一个实用的解决方案,但也许不是一个非常简洁的解决方案。有更好的方法吗?
答案 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。