2015-11-17 4 views
1

Это для Django 1.8Джанго список админ фильтр QuerySet зависит список изменений результатов

models.py

class ProductClass(models.Model): 
    product_class = models.CharField(max_length=30) 

    def __unicode__(self): 
     return self.secondary_class 


class Product(models.Model): 
    name= models.CharField(max_length=30) 
    product_class = models.ForeignKey(ProductClass, db_index=True) 

    def __unicode__(self): 
     return self.name 

Я хочу, чтобы отобразить фильтр списка в ProductAdmin со списком, если классификации продуктов с количеством продуктов рядом с каждой записью.

Класс продукта

  • Книга (100)
  • Ручки (10)
  • Линейки (33)

Я сумел сделать это для супер набора данных

admin.py

class DynamicProductClassFilter(admin.SimpleListFilter): 
    title = _('Product Class')  

    # Parameter for the filter that will be used in the URL query. 
    parameter_name = 'p_class'   

    def lookups(self, request, model_admin): 
     classes = ProductClass.objects.annotate(number_products=Count('product')) 

     return [(c.id, '%s (%s)' % (c.product_class , c.number_products)) for c in classes] 

Теперь я хочу, чтобы это обновляется на основе других фильтров, которые применяются к набору данных, будь то критерии поиска или других списков фильтров применяются.

Я думал, что могу использовать тот факт, что «запрос» и «model_admin» доступны в «def queryset» фильтра списка. после того, как много различных попыток я закончил с помощью следующего кода

def lookups(self, request, model_admin): 
    products = model_admin.get_queryset(request) 
    product_ids = products.values_list('id', flat=True) 
    classes = ProductClass.objects.filter(product__id__in=product_ids).annotate(number_products=Count('product')) 

    return [(c.id, '%s (%s)' % (c.product_class, c.number_products)) for c in classes] 

Но, к сожалению, это не получает фильтры применяются к основному набору данных.

Я очень новичок в django и python, поэтому прошу прощения, если здесь отсутствуют базовые знания.

ответ

0

Я нашел решение, которое работает для меня сейчас, но мне все же хотелось бы получить обратную связь/рекомендации о том, как это можно сделать лучше и более универсальным/поддерживаемым способом.

def lookups(self, request, model_admin): 
    concept_filter = request.GET.get('p_concept', None) 
    if concept_filter: 
     classes = ProductClass.objects.filter(product__title__concept_id=concept_filter).annotate(number_products=Count('product')) 
    else: 
     classes = ProductClass.objects.annotate(number_products=Count('product')) 

    return [(c.id, '%s (%s)' % (c.product_class, c.number_products)) for c in classes] 

я обнаружил, что я мог бы получить критерии фильтрации применяются к списка изменений набора данных с помощью

concept_filter = request.GET.get('p_concept', None) 

Что для моего использования дело работает точно так же хорошо, как я предпочел бы, чтобы этот список фильтр только от на одном другом фильтре.

Было бы интересно узнать, как изменить это решение, чтобы вы могли перебирать все параметры запроса и знать, как правильно построить запрос. Я не знаю, где вы могли бы получить связь между именем параметра и столбцом, который должен фильтровать. Возможно, здесь могут помочь только соглашения об именах.

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