1

ORMを使用して次のクエリを起動する必要があります

SELECT GROUP_CONCAT( af.name ) AS item, ac.name AS categories
FROM admin_fooditem af
JOIN admin_category ac ON ( ac.id = af.category_id ) 
GROUP BY ac.id

出力は以下のとおりです

item                              Categories

Tuborg beer                       Beverages
Mutter Paneer,Palak Paneer        Vegeterian entries
Coke,Fanta                        Soft drinks

元のテーブルは

admin_category

        id  name    
        11  Softdrinks
        5   Vegeterian Entry
        2   Beverages

admin_fooditem

        id  name         category_id
        1   Palak Paneer    5
        2   Mutter Paneer   5
        5   Tuborg beer     2
        6   Coke            11
        7   Fanta           11 

テンプレートで単純な結合query(FoodItem.objects.select_related('Category').all())regroupタグを使用しましたが、上記のSQLのjson出力が必要になりました。無知なので、今のところ生のSQLを使用しています

ありがとう!

4

2 に答える 2

1

django 1.4 を使用している場合はprefetch_related()、Categories QuerySet を呼び出すことができます。@ColeMaclean が指摘したように、効率が若干低下する可能性があります。

古いバージョンの django を使用していて、これらのクエリが頻繁に実行される場合は、生の SQL を使用してください。extra()カスタムのgroup byステートメントが必要なため、クエリセットで使用する唯一の方法は機能しません(実際に使用を提案する回答を書き始めextra()ましたが、GROUP BYパラメーターを追加できないことがわかりました)。

prefetch_related()Cole によるコードがないと、各カテゴリのデータベースにヒットします。本番環境でこのようなコードを使用すると、ページごとに数百のデータベース クエリを簡単に実行できます。

于 2012-05-15T17:04:54.190 に答える
0

Djangoで必要に応じて生のクエリを使用できますが、この場合はおそらくORMを使用する必要があると思います. (ごくわずかに)効率は劣りますが、操作ははるかに簡単です。

たとえば、次のようにします (テストされていないため、動作しない可能性があります)。

json_dict = {}
for category in Category.objects.all():
    json_dict.update({
        'category': category.name,
        'items': ','.join(category.items.values_list('name', flat=True)),
    })

次に、結果を JSON エンコードします。

于 2012-05-15T09:32:32.233 に答える