SQLite3 と MySQL でテストしている次のモデルがあります。
# (various model fields extraneous to discussion removed...)
class Run(models.Model):
runNumber = models.IntegerField()
class Snapshot(models.Model):
t = models.DateTimeField()
class SnapshotRun(models.Model):
snapshot = models.ForeignKey(Snapshot)
run = models.ForeignKey(Run)
# other fields which make it possible to have multiple distinct Run objects per Snapshot
Snapshot.id が指定された値を下回っている一連の runNumbers とスナップショット ID を取得するクエリが必要です。単純に、これが機能することを期待します:
print SnapshotRun.objects.filter(snapshot__id__lte=ss_id)\
.order_by("run__runNumber", "-snapshot__id")\
.distinct("run__runNumber", "snapshot__id")\
.values("run__runNumber", "snapshot__id")
しかし、これは爆発します
NotImplementedError: DISTINCT ON fields is not supported by this database backend
両方のデータベース バックエンドに。残念ながら、Postgres はオプションではありません。
生の SQL にフォールバックする時が来ましたか?
更新:
DjangoのORMはこれを解決するのに役立たないので(@jknuppに感謝)、次の生のSQLを機能させることができました:
cursor.execute("""
SELECT r.runNumber, ssr1.snapshot_id
FROM livedata_run AS r
JOIN livedata_snapshotrun AS ssr1
ON ssr1.id =
(
SELECT id
FROM livedata_snapshotrun AS ssr2
WHERE ssr2.run_id = r.id
AND ssr2.snapshot_id <= %s
ORDER BY snapshot_id DESC
LIMIT 1
);
""", max_ss_id)
livedata
これらのテーブルが存在する Django アプリを次に示します。