Python Django:在最大外键值上选择不同的值

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):

我正在使用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低于某个指定值的文件提供一组运行编号和快照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。