Django select_related with join on multiple fields

时间:2014-03-10 12:02:38

标签: django postgresql

我在django中有一个有点复杂的数据库。它广泛使用分区表。我在使用django和分区表之前遇到了一些问题,但到目前为止,我已经找到了解决所有问题的令人满意的解决方案。

我的最新问题涉及两个分区表之间的外键关系。我有一个名为Event的模型,其中包含一个名为MonitorEvent的子模型,其中包含此类事件的一些附加信息。对于我的问题,模型的重要领域是:

class Event(models.Model):
    id PK, (automatically added)
    ts timestamp

class MonitorEvent(Event):
    event_ptr_id FK -> Event (automatically added)
    ts_copy timestamp

两个表都使用时间戳按月分区。然而,时间戳不是PK的一部分,因为django不允许多字段PK。 (我尝试使用加入的PK字段但没有成功Stackoverflow Question)因此,我需要子类中的时间戳副本以允许子类的分区表。

现在我的问题:我通常会通过执行以下选择所有事件和MonitorEvent:

Event.objects.all().select_related('monitorevent')

(当然,我会添加一些过滤器,以便不选择所有可用的事件。)根据我的理解,这将导致SQL查询,如:

SELECT * FROM event LEFT JOIN monitorevent ON event.id = monitorevent.event_ptr_id;

应该将所有事件表分区与所有monitorevent表分区连接起来。我真的想要这样的东西:

SELECT * FROM event LEFT JOIN monitorevent ON event.id = monitorevent.event_ptr_id AND event.ts = monitorevent ts_copy;

应该允许查询规划器使用分区方案来加速查询。

django是否有可能编写一个自定义管理器来修改默认的select_related以在查询的ON条件中包含一个附加字段?

我的另一种可能性是编写一个手动执行select_related的自定义原始查询,但是根据这个问题Django select related in raw request,除了问题中的手册提议外,这似乎不可能。

当然我还可以将其他字段添加到原始事件模型中并删除可以完全消除问题的子模型,但这将是我最不喜欢的解决方案。

我将Django 1.5与postgres DB结合使用。

感谢您的建议。

0 个答案:

没有答案