Джанго, простой способ запросить отношения один ко многим? - PullRequest
1 голос
/ 09 июля 2011

Итак, я хочу вернуть dict в javascript из двух таблиц: таблицы категорий и таблицы подкатегорий с категорией = 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())

Что-нибудь более эффективное / более быстрое?Мой код выглядит хорошо?Я также предполагаю, что это делается только с одним запросом.Это правда?

Ответы [ 2 ]

1 голос
/ 09 июля 2011
Sub_category.objects.filter(category__name=category).values('name')
0 голосов
/ 09 июля 2011

Итак, вы внедряете иерархию в своей базе данных? Я только начал работать над тем же, только пользовательская иерархия. Как вы, наверное, поняли, иерархии неэффективны для моделирования с простым внешним ключом. Это еще один способ моделирования данных, называемый «модифицированным деревом обхода предварительного заказа» (MPTT), который гораздо более эффективен. См. django-mptt для реализации, предварительно созданной для django.

Вы можете вызвать запрос в модели mptt, чтобы получить все узлы в одном запросе, но вам может потребоваться выполнить цикл по всем узлам и создать словарь самостоятельно. Каждый узел имеет родительские и дочерние отношения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...