3

この投稿のおかげで、Djangoビューでクエリごとにカウントとグループ化を簡単に行うことができます。

カウントとグループ化に相当するDjango

私がアプリで行っているのは、ある国のデータベースで利用可能なコインの種類と額面のリストを表示しているため、英国のコインの額面は「1ファージング」または「6ペンス」である可能性があります。はface_value6、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モデルなので、テンプレートでCurrency.nameフィールドを取得できます)。

それを行うための最良の方法は何ですか?

4

3 に答える 3

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()
于 2009-07-16T19:13:18.103 に答える
1

select_related()かなり近づきましたが、選択したすべてのフィールドをgroup_by句に追加する必要がありました。

そこでvalues()、の後に追加してみましたselect_related()。立ち入り禁止。次に、クエリのさまざまな位置でそれぞれのさまざまな順列を試しました。閉じますが、完全ではありません。

私はSQLクエリの書き方をすでに知っていたので、結局「飛び出し」、生の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クエリセット言語で表現する方法があれば、知りたいと思います。カウントと2列によるグループ化を使用したSQL結合は非常にまれではないと思います。そのため、クリーンな方法がなかったとしたら驚きます。

于 2009-07-17T14:33:54.627 に答える
0

select_related()http://docs.djangoproject.com/en/dev/ref/models/querysets/#id4を試しましたか

私はそれをよく使います、それはうまくいくようです、そしてあなたはcoin_values.currency.nameに行くことができます。

また、フィルターでcountry = country.idを実行する必要はないと思います。country=countryだけですが、入力を減らす以外にどのような違いがあるのか​​わかりません。

于 2009-07-16T16:29:09.167 に答える