Django,查询一对多关系的简单方法?

时间:2011-07-08 23:36:57

标签: javascript python sql django json

所以我想在两个表的javascript中返回一个分类表和一个带有category = models.ForeignKey(Category)的Sub_category表的dict。字典是'Category1':'Sub_cat1,Sub_cat2,...'。我做了以下代码,但效率似乎非常低,所以你们能帮助我找到另一种方法吗?

谢谢!

from models import Sub_category, Category
# Extra unnecessary query?
def get_json_sub_categories(category):
    return get_json(Sub_category.objects.filter(category_id=Category.objects.filter(name=category).values('pk')[0]['pk']).values('name'))

添加了: 字典应包含所有类别及其各自的子类别。我可以创建一个循环或其他东西,并为每个类别调用查询,但这是很多查询。是否有一个查询可以以字典样式获取所有类别及其各自的子类别?

我这样做了:

from models import Sub_category, Category
import json
def get_sub_categories():
    return Sub_category.objects.all().values('name', 'category__name')

def get_dict_sub_categories():
    sub_dict = {}
    sub_queryset = get_sub_categories()
    for x in sub_queryset:
        if x['category__name'] not in sub_dict:
            sub_dict[x['category__name']] = [x['name']]
        else:
            sub_dict[x['category__name']].append(x['name'])
    return sub_dict

def get_json_sub_categories():
    return json.dumps(get_dict_sub_categories())

更高效/更快?我的代码看起来不错吗?我还假设这只用一个查询完成。这是真的吗?

2 个答案:

答案 0 :(得分:1)

Sub_category.objects.filter(category__name=category).values('name')

答案 1 :(得分:0)

所以你在数据库中实现层次结构?我刚刚开始研究同一件事,只是一个用户层次结构。正如您似乎已经意识到的那样,层次结构使用简单的外键进行建模是无效的。它们是另一种对数据进行建模的方法,称为“修改的预订遍历树”(MPTT),效率更高。有关django预构建的实现,请参阅django-mptt

您可以在mptt模型上调用查询以获取一个查询中的所有节点,但您可能需要遍历所有节点,并自己构建字典。每个节点都有父子关系。