Django 1.7 で webapp を刷新しています。とても楽しかったです...そして涙と血!
過去数日間、単純な LEFT JOIN を実行して、FK のないテーブルからいくつかの値を集計するのに苦労していました。クエリの結果はクラス ビュー (DetailView) に表示されます。Web 全体 (World Wide Web を含む) で答えを検索し、検索しても役に立たなかったと信じてください。
テーブルに外部キーがないのはなぜですか? 元のデータベース設計には何もありませんでしたが、現在、テーブルは数億行を保持しています。FK 制約を追加することもできますが、それには費用がかかりますが、物事が中断され、抽出と読み込みを行うスクリプト全体を作り直す必要があります。
Djangoによると、
raw() には、それを非常に強力にする他のオプションがたくさんあります...
そうだね。真実はmodel.objects.raw()であり、その力は制限されており、私がやりたいことに対しては機能しません (集計しないだけです)。
テーブル/モデル (簡略化)
Table `customer` (customer_id, order_id)
Table `order` (order_id, order_name)
MySQL/Django クエリ (簡略化)
'SELECT a.order_id, SUM(a.order_value)
FROM order a
LEFT JOIN customer b
ON a.order_id = b.order_id
WHERE b.customer_id = %s', [customer_id]
とても無邪気に見えますよね?なんてこった!ジャンゴの悪夢だ!もちろん、Django で__setを使用して簡単に実行できますが、残念ながら、FKがありません。
私の問題に加えて、DetailView テンプレートのコンテキストに集計を追加しようとしています。そこで、View()でハッキングして、DetailView カスタム クラス内に関数を作成しました。
def NewContextFTW():
# here get the freaking queryset in my own terms
return myhighlycomplexqueryset
そして、テンプレートで:
{% for rows in view.NewContextFTW %}
{{rows.id}}
{{rows.sum_order_value}}
{% endfor %}
...しかし、失敗しました。
編集: 今日解決策を見つけました!そして、その愛を世界に広めたい!以下の私の答えを見てください。