Django内连接在同一个表上

时间:2012-12-15 16:35:02

标签: django group-by inner-join annotate

提前感谢您的帮助。

我有一个SQL查询,一个不太热衷于Django的开发人员要求我演示如何使用该框架。

SELECT h.cuh_cur_code_inc, h.cuh_cur_code_out, h.cuh_rate, h.cuh_date
FROM
(
    SELECT cuh_cur_code_inc, cuh_cur_code_out, MAX(cuh_id) as cuh_id_max
    FROM cur_hist
    WHERE cuh_cur_code_out = 'GBP'
    GROUP BY cuh_cur_code_inc, cuh_cur_code_out
) latest
INNER JOIN cur_hist h ON latest.cuh_id_max = h.cuh_id


+------------------+------------------+----------+---------------------+
| cuh_cur_code_inc | cuh_cur_code_out | cuh_rate | cuh_date            |
+------------------+------------------+----------+---------------------+
| EUR              | GBP              |   0.8126 | 2012-12-03 06:00:28 |
| USD              | GBP              |   0.6241 | 2012-12-02 06:00:25 |
+------------------+------------------+----------+---------------------+

上面是一个示例结果表。我可以通过2次调用实现上述结果(显然这并不困难),但我似乎无法重新创建内连接。

histories = CurHist.objects.filter(cuh_cur_code_out='GBP') \
                               .values('cuh_cur_code_inc', 'cuh_cur_code_out') \
                               .annotate(cuh_id_max=Max('cuh_id'))

histories = CurHist.objects.filter(cuh_id__in=[x['cuh_id_max'] for x in histories]).order_by('-cuh_rate')

该模型如下所示:

class CurHist(models.Model):
    cuh_id = models.IntegerField(primary_key=True)
    cuh_cur_code_inc = models.CharField(max_length=9)
    cuh_cur_code_out = models.CharField(max_length=9)
    cuh_rate = models.FloatField(null=True, blank=True)
    cuh_date = models.DateTimeField(

我知道Django在对象管理器上的额外方法,但在这种情况下我不确定如何使用它。这是否是正确的接受方式,还是我试图通过圆孔安装方形钉?

任何帮助将不胜感激!

0 个答案:

没有答案