【发布时间】:2017-08-21 13:10:54
【问题描述】:
作为我正在从事的项目的一部分,我正在尝试为不同类型的对象构建分层数据结构。
我使用了django-mptt,它承诺通过快速查询以智能方式处理树。
问题是,我有多个模型需要参与到这个数据树中,所以我使用泛型关系来存储所需的数据。
我构建的模型的一个 sn-p:
class CPNode(MPTTModel):
content_type = models.ForeignKey(ContentType, null=True, blank=True)
object_id = models.PositiveIntegerField(null=True)
content_object = GenericForeignKey('content_type', 'object_id')
parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True)
...
这给了我想要的,除了查询问题。
我认为查询所有数据将花费多次查询(每次我想获取 content_object 本身)。
是否有人知道我如何维护这种结构,同时能够在可扩展的查询中获取所有数据?
【问题讨论】:
-
您遇到的具体问题是什么?您已为此选择使用关系数据库,因此您无法避免在这些类型的查询中使用一些 JOIN。如果您需要在查询中直接获取
content_object,请使用prefetch_related,以避免多次查询。是否可扩展取决于您的数据。 NoSQL DB 可能更适合这种树。 -
问题是,这些数据的很大一部分已经在生产中。所以转向 NoSQL DB 是我最后的选择。我还没有开始,但是提前考虑,似乎查询具有多种类型节点的大树会很麻烦。我有多种类型的资产,每种类型都由一个模型维护,每种资产都可以有不同类型的资产。
标签: python django django-orm django-mptt django-generic-relations