作为我正在从事的项目的一部分,我正在尝试构建来自不同类型的对象的分层数据结构。
我使用了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本身(。
有没有人知道我如何维护这种结构,同时能够在可扩展的查询中获取所有数据?
关系数据库(至少SQL数据库(在异构树方面并不是那么好......MPTT 确实会通过避免递归查询来极大地提高读取性能,但这并不能解决GenericForeignKey
黑客问题 - 只是没有办法在 SQL 级别实现这样的功能,所以如果你使用它,是的,你将需要每个节点多一个查询来获取有效内容。
避免这些额外查询的唯一方法是在同一模型中塞入每个节点子类型的每个字段,向其添加"node_type"字段并使用每个节点类型的代理模型。代码不会很漂亮(在这里,完成了(,但是好吧,这里几乎没有其他选择......