どのように私はジャンゴで余分な()。値()の呼び出しでは、関連するオブジェクトを得るのですか?
-
16-09-2019 - |
質問
私は簡単にDjangoのビューでクエリによってカウントし、グループでくださいすることができるよこの投稿に感謝します:
にすることにより、カウントやグループのためのDjangoの同等の
英国からコインが「1つのファーシング」または「6ペンス」の額面を持っているかもしれないので、私は私のアプリでやっていることは、国のために私のデータベースで利用可能なコインの種類と顔値のリストが表示されています。 face_value
が6である、currency_type
は関連テーブルに格納されている「ペンス」、である。
私は私が道の90%を取得し、私の見解では、次のコードを持っています
def coins_by_country(request, country_name):
country = Country.objects.get(name=country_name)
coin_values = Collectible.objects.filter(country=country.id, type=1).extra(select={'count': 'count(1)'},
order_by=['-count']).values('count', 'face_value', 'currency_type')
coin_values.query.group_by = ['currency_type_id', 'face_value']
return render_to_response('icollectit/coins_by_country.html', {'coin_values': coin_values, 'country': country } )
currency_type_id
(すなわち4)外部キーフィールドに格納されている数として遭遇します。私は何をしたい、それがクエリの一部として参照することを実際のオブジェクトを取得する(通貨モデルなので、私は私のテンプレートでCurrency.nameフィールドを取得することができます)です。
それを行うための最善の方法は何でしょうか。
解決 2
select_related()
は、私はかなり近い得たが、それは私が私がgroup_by
句に選択したすべてのフィールドを追加したい。
だから私はvalues()
後select_related()
を追加してみました。立ち入り禁止。それから私は、クエリの異なる位置にそれぞれの様々な順列を試してみました。閉じる、しかしかなります。
私はすでにSQLクエリを作成する方法を知っていたことから、「アウトwimping」とだけ生のSQLを使用して終了します。
def coins_by_country(request, country_name):
country = get_object_or_404(Country, name=country_name)
cursor = connection.cursor()
cursor.execute('SELECT count(*), face_value, collection_currency.name FROM collection_collectible, collection_currency WHERE collection_collectible.currency_type_id = collection_currency.id AND country_id=%s AND type=1 group by face_value, collection_currency.name', [country.id] )
coin_values = cursor.fetchall()
return render_to_response('icollectit/coins_by_country.html', {'coin_values': coin_values, 'country': country } )
Djangoのクエリセットの言語で正確なクエリは、私が知りたいだろうフレーズへの道がある場合。私はSQLが2列数とグループ化して参加した超レアではないので、クリーンな方法がなかった場合、私は驚かれることだろうと想像します。
他のヒント
あなたはvalues()
でそれを行うことはできません。しかし、それを使用する必要はありません - あなただけの実際のCollectible
オブジェクトを取得することができ、それぞれが関連するリンクされたオブジェクトになりますcurrency_type
属性を持つことになります。
そしてjustinhamadeが示唆するように、select_related()
を使用すると、データベースクエリの数を削減するのに役立ちます。
それを一緒に入れて、あなたが得る:
coin_values = Collectible.objects.filter(country=country.id,
type=1).extra(
select={'count': 'count(1)'},
order_by=['-count']
).select_related()
あなたは() HTTP select_relatedを試してみました。 djangoproject.com/en/dev/ref/models/querysets/#id4する
私はそれあなたはcoin_values.currency.nameを行くことができるだけでなく動作するようですたくさん使用します。
また、私はあなたのフィルター、ちょうど国=国に国= country.idを行う必要があると思ういけないが、私はあまりタイピング以外作ることどのような違いを確認していない。