0

作为我正在从事的项目的一部分,我正在尝试构建来自不同类型的对象的分层数据结构。

我使用django-mptt它,它承诺通过快速查询以智能方式处理树。

问题是,我有多个模型需要参与这个数据树,所以我使用通用关系来存储所需的数据。

我构建的模型片段:

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 本身)。

有谁知道我如何维护这种结构,同时能够在可扩展的查询中获取所有数据?

4

1 回答 1

0

当涉及到异构树时,关系数据库(至少是 SQL 数据库)并不是那么好……MPTT 确实会通过避免递归查询来极大地提高读取性能,但这并不能解决问题GenericForeignKey——没有办法要在 SQL 级别实现这样的功能,所以如果您使用它,是的,您将需要每个节点再进行一次查询才能获得有效的内容。

避免这些额外查询的唯一方法是在同一模型中填充每个节点子类型的每个字段,向其中添加“node_type”字段并使用每个节点类型的代理模型。代码不会很漂亮(在这里,做过)但是,这里几乎没有其他选择......

于 2017-08-21T13:44:55.703 回答