1

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 %}

...しかし、失敗しました。

編集: 今日解決策を見つけました!そして、その愛を世界に広めたい!以下の私の答えを見てください。

4

1 に答える 1