Django中可选嵌套模型的方法

时间:2019-05-13 12:51:21

标签: django database nested inventory

我正在为公司创建一个简单的内部资产跟踪应用程序。目前,我们通过excel(糟糕)来执行此操作。我将其分解为:

资产/项目-工具,硬件,零件等。 站点-所在的总体位置:设施A,站点位置B Bin-资产所在的子位置,可以是建筑物,工具箱或板条箱。

垃圾箱给我带来了麻烦,因为一个项目可以放置在没有垃圾箱的站点上,或者一个垃圾箱可以位于另一个垃圾箱内,我尚不确定构建此数据库的最佳方法。

我尝试过使用多个外键,但是这样会很混乱或至少有感觉。我还尝试过使用列出的here替代Django的GenericForeign Keys的替代方法,我之前在微妙的不同应用程序中使用了它们,但自引用却使我感到困惑。最后,我希望能够在站点上收集项目列表,然后为每个工具箱及其内部的项目缩进一行,是否有一种很好的方法来设置模型,以便能做到这一点?

1 个答案:

答案 0 :(得分:1)

您可能要考虑两种观点:1.模型是否易于阅读,非冗余且与您的问题一致; 2.您希望在模型上运行哪种查询。

您已经考虑过第一个方面。关于第二个,我相信您要执行的一些查询是: 1.列出资产并链接其位置。 2.计算一个地点的资产 3.导航位置层次结构,并列出每个位置的所有资产

上面的建议您为包含建筑物,垃圾箱等的位置创建一个模型,并通过字段location_type区分它们,该字段可能是字典表(id,name)的外键。那么您将需要一个将Foreign_key自己引用到父位置的自我来创建层次结构。

这样,您将有一个外键指向资产中的位置,并且给定了位置,您可以直接查询asset_set。任何其他模型都不太透明。可以使用@property方法来解决任何差异,例如要保存特定于建筑的字段,您可以创建一种方法,该方法首先检查类型是否正确,然后将值保存到char_field_1

这样的动态字段中

上述内容的一种变体。如果BinBuilding等的属性太多且不同,无法合并到一个表中。然后,您可以为每个模型创建单独的模型,并从“位置”到每个模型都有一个可为空的一对一字段。保存后,可以检查是否已填充一个或多个。