【问题标题】:Django, simple way to query one to many relationships?Django,查询一对多关系的简单方法?
【发布时间】:2011-07-08 23:36:57
【问题描述】:

所以我想在两个表的 javascript 中返回一个字典,一个 Category 表和一个 Sub_category 表,其中 category = models.ForeignKey(Category)。字典是'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())

有什么更高效/更快的吗?我的代码看起来还好吗?我还假设这仅通过一个查询完成。这是真的吗?

【问题讨论】:

    标签: javascript python sql django json


    【解决方案1】:
    Sub_category.objects.filter(category__name=category).values('name')
    

    【讨论】:

    【解决方案2】:

    所以您要在数据库中实现层次结构?我刚开始做同样的事情,只是一个用户层次结构。正如您似乎已经意识到的那样,层次结构使用简单的外键建模效率低下。他们是另一种建模数据的方法,称为“修改前序遍历树”(MPTT),效率更高。请参阅django-mptt 了解预构建到 django 的实现。

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

    【讨论】:

      猜你喜欢
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多