Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Django,查询一对多关系的简单方法?_Javascript_Python_Sql_Django_Json - Fatal编程技术网

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

Javascript Django,查询一对多关系的简单方法?,javascript,python,sql,django,json,Javascript,Python,Sql,Django,Json,因此,我想在javascript中返回两个表的dict:Category表和Category=models.ForeignKey(Category)的Sub_Category表。字典应该是“Category1”:“Sub_cat1,Sub_cat2,…”。我做了下面的代码,但似乎效率很低,所以你们能帮我找到另一种方法吗 谢谢 from models import Sub_category, Category # Extra unnecessary query? def get_json_sub_

因此,我想在javascript中返回两个表的dict:Category表和Category=models.ForeignKey(Category)的Sub_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())

有没有更高效/更快的?我的代码看起来还好吗?我还假设这只需要一个查询就可以完成。这是真的吗?

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

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

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

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


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

这是如何工作的?是否有带型号\字段的过滤器?对于任何外键模型?@Derek:这到底是如何工作的?是否有带型号\字段的过滤器?对于任何外键型号?@Derek: