2

助けてくれてありがとう。

Django にそれほど熱心ではない開発者が、フレームワークを使用した作業のデモンストレーションを求めているという SQL クエリがあります。

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 の追加メソッドがあることは知っていますが、この場合、それをどのように使用すればよいかわかりません。これは正しいアプローチですか、それとも円形の穴に四角いペグをはめようとしていますか?

どんな助けでも大歓迎です!

4

0 に答える 0