我需要使用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
我使用了简单的连接查询(FoodItem.objects.select_related('Category')。all())然后重新组合模板中的标签,但现在我需要上面sql的json输出,我无能为力所以我正在使用原始sql现在
谢谢!
答案 0 :(得分:1)
如果你使用的是django 1.4,你可以在你的类别查询集上调用prefetch_related()
,它的效率可能稍低,正如@ColeMaclean指出的那样。
如果您使用较旧的django版本并且这些查询将经常执行,请坚持使用原始SQL。唯一的另一种方法,在QuerySet上使用extra()
将不起作用,因为您需要自定义group by语句(我实际上开始编写一个建议使用extra()
的答案,但发现它无法添加GROUP BY参数)。
如果没有prefetch_related()
,Cole的代码将命中每个类别的数据库。通过在生产中使用这样的代码,每页执行几百个数据库查询很容易。
答案 1 :(得分:0)
如果你想在Django中使用raw queries,但我想在这种情况下你应该只使用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对结果进行编码。