Python Django:在最大外键值上选择不同的值
我正在使用SQLite3和MySQL测试以下模型:Python Django:在最大外键值上选择不同的值,python,mysql,django,Python,Mysql,Django,我正在使用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):
# (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低于某个指定值的文件提供一组运行编号和快照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
对于两个数据库后端。不幸的是,博士后不是一个选择
是时候回到原始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应用程序。注意事项非常清楚:
注:
order_by调用中使用的任何字段都包含在SQL SELECT列中。当与distinct结合使用时,有时会导致意外结果。如果按相关模型中的字段排序,则这些字段将添加到选定的列中,否则可能会使重复的行看起来不同。因为额外的列不会出现在返回的结果中,它们只是为了支持排序,所以有时看起来像是返回了非不同的结果
类似地,如果使用值查询来限制选定的列,则仍将涉及按任何顺序或默认模型顺序使用的列,并且可能会影响结果的唯一性
这里的寓意是,如果您使用的是distinct,请注意按相关模型排序。类似地,当同时使用distinct和values时,按values调用中没有的字段排序时要小心
此外,以下是:
这种使用distinct指定字段名的功能仅在PostgreSQL中可用
因此,您希望它返回一个runNumbers列表,其中返回的每一行还包含一个附加到它的大量快照ID的列表?@TimmyO'Mahony不完全是;我想获得一个快照id,即每次运行的最新但不超过ss的id。