Django预取嵌套表

时间:2012-12-15 17:56:57

标签: python mysql django

我有以下表结构:

menu --{ page --{ title

从菜单中我想获取相关页面。页面也有相关的标题。 以下代码完全按照我的意愿工作,但for循环每次迭代都会生成一个单独的查询。

初始查询中的prefetch_related似乎没有获取标题。有没有更好的方法来执行此操作,从而导致查询数量较少?

 menu_data = MenuOrder.objects \
            .filter(menu__name=kwargs['menu']) \
            .filter(page__title_set__language=language) \
            .prefetch_related('page') \
            .order_by('priority')

    for menu_obj in menu_data:
        title_obj = menu_obj.page.title_set.get()

提前致谢,

2 个答案:

答案 0 :(得分:3)

您可以尝试:

.prefetch_related('page__title')

Quoting prefetch-related doc

以下都是合法的:

Restaurant.objects.prefetch_related('pizzas__toppings')

另外,请记住,对于reduce查询,您应该使用select_related

答案 1 :(得分:0)

好吧,我发现扭转这种关系减少了大量的查询次数:

title_data = Title.objects \
    .filter(language=language) \
    .filter(page__menuorder__menu__name=kwargs['menu']) \
    .order_by('page__menuorder__priority')

我不知道是否有更好的方法,所以现在我会接受这个。感谢所有看过的人..