Django 中可选嵌套模型的方法

Method for optionally nested models in Django

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

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

Bin 给我带来了问题,因为项目可以位于没有 Bin 的站点上,或者 Bin 可以位于另一个 Bin 中,我还不确定构建此数据库的最佳方式。

我已经尝试过使用多个外键,但这样会变得混乱,或者至少感觉是这样。我也尝试过使用 Django 的 GenericForeign Keys 的替代品,如所列 here 我之前使用过它们,但应用程序略有不同,但自我引用让我感到困惑。最后,我希望能够在一个站点上收集一个项目列表,然后为每个工具箱和里面的项目设置缩进线,有没有一种设置模型的好方法可以实现这种情况?

您可能需要考虑两个观点:1. 模型是否易于阅读、无冗余且与您的问题一致,2. 您要进行什么样的查询 运行在模型上。

第一方面你已经想到了。关于第二个,我相信您要执行的一些查询是: 1. 列出资产和 link 它们的位置。 2. 统计一个地点的资产 3. 导航位置层次结构并列出每个位置的所有资产

以上建议您为包括建筑物、垃圾箱等的位置创建一个模型,并通过一个字段 location_type 区分它们,该字段可能是字典的外键 table(身份证、姓名)。那么您将需要一个自引用 foreign_key 到父位置,以创建层次结构。

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

上述的变体。如果 BinBuilding 等的属性太多且不同,无法合并为一个 table。然后,您可以为每个模型创建单独的模型,并从 Location 到每个模型都有一个可为 null 的 one-to-one 字段。保存时,您可以检查是否填充了一个以上。