所以我想在两个表的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())
更高效/更快?我的代码看起来不错吗?我还假设这只用一个查询完成。这是真的吗?
答案 0 :(得分:1)
Sub_category.objects.filter(category__name=category).values('name')
答案 1 :(得分:0)
所以你在数据库中实现层次结构?我刚刚开始研究同一件事,只是一个用户层次结构。正如您似乎已经意识到的那样,层次结构使用简单的外键进行建模是无效的。它们是另一种对数据进行建模的方法,称为“修改的预订遍历树”(MPTT),效率更高。有关django预构建的实现,请参阅django-mptt。
您可以在mptt模型上调用查询以获取一个查询中的所有节点,但您可能需要遍历所有节点,并自己构建字典。每个节点都有父子关系。