Django ORM - 使用多个模型构建分层数据结构

时间:2017-08-21 13:10:54

标签: python django django-orm django-mptt django-generic-relations

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

我使用了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本身)。

是否有人知道如何维护此结构,同时能够在可伸缩查询中获取所有数据?

1 个答案:

答案 0 :(得分:0)

当涉及到异构树时,关系数据库(至少是SQL数据库)并不是那么好...... MPTT确实会通过避免递归查询的需要来大大提高读取性能,但这不会解决{ {1}} hack - 没有办法在SQL级别实现这样的功能,所以如果你使用它,是的,每个节点需要多一个查询来获得有效的内容。

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