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