【问题标题】:Django - unique ids for all instances of subclasses of a class?Django - 一个类的所有子类实例的唯一ID?
【发布时间】:2013-06-25 14:16:53
【问题描述】:

很抱歉,我想不出更好的方式来描述标题中的问题,如果可以的话,请随时编辑:)

我的问题是:在 Django 中,我有一个名为 Item 的抽象类(子类化 models.Model)。然后我有一堆 Item 的子类,例如 FoodItem、BookItem、ToyItem... 我决定采用这种结构是因为每个 Item 都具有几乎相同的字段(Item name 等),但用法会有所不同,具体取决于它是什么类型。

我希望每个项目都有一个唯一标识符,以便我可以轻松引用它。由于每个子类都是自己的数据库表,我认为我不能使用主键。我怎样才能让每个项目都有一个唯一的 id,而不是每个 FoodItem 都有唯一的 id 但可能与 BookItems 等重叠......最后,当我通过它的 id 获得一个项目时,有没有一种优雅的方式来判断什么项目类型它是?

如果有更好的方法,我愿意以不同的方式做这件事。谢谢。

【问题讨论】:

  • 代替基本/子模型关系,只需向项目类型声明ForeignKey。这样就可以保证您拥有唯一的 ID
  • 哇,好主意。我不应该使用 OneToOne,因为每个 FoodItem、BookItem 等都对应一个 Item?
  • 哦。我在考虑类别而不是项目。你说的对。您可以使用 OneToOne。
  • 你能把它作为答案发布吗?这是一个很好的答案。

标签: django inheritance django-models


【解决方案1】:

强烈推荐使用django-typed-models (github)。它的存在是为了解决您的问题(许多子类具有大部分相同的字段但行为不同)并且您可以免费获得唯一的主键。

来自维基页面:

特点

  • 从查询集中自动向下转换模型。
  • 从一个公共基础子类化的所有模型都存储在同一个表中
  • 对象类型存储在数据库的“类型”字段中
  • 无需额外的查询或连接来检索多种类型

【讨论】:

    猜你喜欢
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多