2016-01-25 5 views
0

Для ForeignKeys я могу сделать select_related(), но есть ли способ сделать что-то похожее на BooleanFields? Мое приложение в настоящее время проверяет более 600 раз, если у объекта есть is_app_category, установленного в True, что является излишним и занимает 10 секунд, чтобы загрузить страницу (все еще небольшое число, так как конечный продукт будет иметь тысячи записей).django - получить все объекты с истинным значением в одном запросе

просмотров .py:

def assign_app_categories(request): 
    user = request.user 
    if user.is_admin: 
     category_list = Categories.objects.select_related('company').filter(show_in_menu = True, is_app_category = False) 
    else: 
     category_list = Categories.objects.filter(company = user.company, show_in_menu = True) 
    number_of_categories = len(category_list) 
    zipped_data = {} 
    CategoriesFormSet = formset_factory(CategoriesAssignForm, extra = number_of_categories) 
    if request.method == "POST": 
     categoriesFormSet = CategoriesFormSet(request.POST) 
     if categoriesFormSet.is_valid(): 
      for (name, cleaned_form) in zip(category_list, categoriesFormSet.cleaned_data): 
       if cleaned_form.get('parent') != None: 
        if user.is_admin: 
         category_item = Categories.objects.filter(name = name).filter(show_in_menu = True)[0] 
        else: 
         category_item = Categories.objects.get(company = user.company, name = name) 
        category_item.parent = cleaned_form.get('parent') 
        category_item.show_in_menu = False 
        category_item.save() 
      messages.success(request, _('Categories are assigned to App categories!')) 
      history = HistoryLog(user = request.user, function = 'categories.assign_app_categories', kind = 404).save() 
      return HttpResponseRedirect('/categories/') 
    else: 
     categoriesFormSet = CategoriesFormSet() 
     zipped_data = zip(category_list, categoriesFormSet) 
    return render(request, 'categories/assign.html', {'zipped_data': zipped_data, 'category_list': category_list, 'categoriesFormSet': categoriesFormSet, 'menu':'categories'}) 

Джанго-отладки инструментов:

SELECT "categories_categories"."id", 
"categories_categories"."is_app_category", 
"categories_categories"."brand_id", 
"categories_categories"."company_id", 
"categories_categories"."name", 
"categories_categories"."slug", 
"categories_categories"."description", 
"categories_categories"."show_in_menu", 
"categories_categories"."gender", 
"categories_categories"."parent_id", 
"categories_categories"."products_count", 
"categories_categories"."date_create", 
"categories_categories"."date_modified" 
FROM "categories_categories" WHERE "categories_categories"."is_app_category" = 'True' 

Duplicated 633 times. 
+1

Вам действительно нужны запросы 'Q'? не будет 'filter (show_in_menu = True, is_app_category = False)' делать то же самое? – Sayse

+0

Да, так оно и есть. Этот проект был передан мне от человека, который больше не работает здесь, и моя задача - исправить ситуацию и сделать ее гладкой. Сложнее всего делать, поскольку большинство вещей не работают, как они должны. – jarkow

+0

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

ответ

0

Теперь, пока я не могу сказать наверняка, что они ниже, помогут, они, конечно, не повредит

  1. Dont использовать Len, чтобы выяснить, сколько категорий, это заставляет разрешение QuerySet без необходимости, вместо того, чтобы использовать .count()
  2. Ваш весь user.is_admin если еще мне кажется странным, так как вы просто фильтрации категорий снова на основе от ранее найдены и, поскольку проверка против name будет просто выполнять сравнение pk, вы не собираетесь отфильтровывать что-либо дополнительно, поэтому category_item уже эквивалентен name, прежде чем выполнять какую-либо фильтрацию.
  3. Сказав все, что вы на самом деле не волнует, если category_item возвращается, так что вы могли бы просто использовать .update() на QuerySet обновить эти совпадающие результаты на стороне базы данных

Помимо этого, вам нужно посмотреть, что вам действительно нужно из категории_list, вы должны попытаться использовать values или values_list, чтобы возвращать только те поля, которые вам интересны.

+0

В большинстве случаев я даже не вхожу в номер , если request.method == «POST» поэтому вопрос находится в другом месте – jarkow

+0

@ JarosławSamulewski - Затем посмотрите мою поправку, вы должны изучить использование 'values' – Sayse

Смежные вопросы