我有以下型号我敢用的SQLite3和MySQL测试:Django的:上最大的外键值选择不同的值
# (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
我想要一个查询,这将给我一套runNumbers &快照的ID为此,Snapshot.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应用程序,这些表活在
所以你希望它返回一个'runNumbers'列表,其中每行返回还包含附加到它的(众多)'快照'ID列表? – 2013-03-14 19:39:11
@ TimmyO'Mahony不完全;我想为每次运行获得一个'snapshot_id',最新的(但不超过'ss_id')。 – JohnJ 2013-03-14 20:03:42