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()在 QuerySet 上使用将不起作用,因为您需要自定义 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 回答