在Django中加入子查询的结果

时间:2017-05-21 17:54:53

标签: python django join subquery

我正在使用Vector Clocks实现分布式事件存储,以建立事件的确定性排序。

我正在尝试使用Django ORM执行以下原始查询:

   SELECT dev_snapshots.global_snapshot_id as snapshot_id, 
          dev_snapshots.environment_id, 
          dev_snapshots.clock,
          test_snapshots.environment_id,
          test_snapshots.clock
   FROM (
          SELECT
            global_snapshot_id,
            clock,
            environment_id
          FROM environment_snapshot
          WHERE environment_id = 'dev') dev_snapshots
     JOIN (
            SELECT
              global_snapshot_id,
              clock,
              environment_id
            FROM environment_snapshot
            WHERE environment_id = 'test') test_snapshots
       ON dev.global_snapshot_id = test.global_snapshot_id
   ORDER BY dev_snapshots.clock, test_snapshots.clock

我的模型如下:

class Environment(models.Model):
    env_name = models.TextField(primary_key=True)
    current_clock = models.BigIntegerField()


class EnvironmentSnapshot(models.Model):
    global_snapshot = models.ForeignKey('GlobalSnapshot')
    environment = models.ForeignKey('Environment')
    clock = models.BigIntegerField()


class GlobalSnapshot(models.Model):
    id = models.AutoField(primary_key=True)   

Environment有一个名为clock的名称和计数器值 EnvironmentSnapshot是单个Environment期间单GlobalSnapshot个时钟值的快照。
GlobalSnapshotEnvironmentSnapshot创建时存在的所有环境收集GlobalSnapshot

我们的想法是首先按“dev”GlobalSnapshot的时钟值对所有Environment进行排序,然后按“test”Environment的时钟值进行排序。无论事件何时收到,事件的确定性顺序。 GlobalSnapshot最终会加入事件存储中记录的事件。

我在Django中查看了Query.join(),但它似乎没有很好的文档记录,甚至不适合最终用户使用。

Django ORM有没有办法做到这一点,或者我只需要为Django构建一个原始查询来执行?

0 个答案:

没有答案