使用django ORM组concat

时间:2012-05-15 07:48:15

标签: python sql django orm

我需要使用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现在

谢谢!

2 个答案:

答案 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对结果进行编码。