2013-12-03 4 views
2

Я пытаюсь добавить функциональность, чтобы пользователь мог выбрать несколько фильтров просмотра для набора элементов на моем сайте (SDK). Код, который у меня есть, возвращает SDK, которые соответствуют любому из тегов фильтров. Как я могу показать только SDK, которые соответствуют всем тегам?Попытка запроса таблицы с несколькими фильтрами

models.py 

class AppSdks(models.Model): 
    sdk_name = models.CharField(max_length=256) 
    sdk_type = models.CharField(max_length=256) 
    company_url = models.URLField(max_length=1024) 
    logo = models.URLField(max_length=1024) 
    description = models.TextField() 
    ios = models.BooleanField() 
    android = models.BooleanField() 


class AppSdksTags(models.Model): 
    sdk = models.ForeignKey(AppSdks) 
    tag = models.CharField(max_length=128) 

views.py 
if request.method=="POST": 
    all_tags = request.POST.getlist('filter_tags') 
    for each_sdk in sdks: 

    results=[] 
    sdk_list=[] 
    sdks = AppSdks.objects.all() 
    for each_tag in all_tags: 
     sdks = AppSdksTags.objects.filter(tag=each_tag).values_list('sdk',flat=True).distinct() 
     for each_sdk in sdks: 
      if each_sdk not in sdk_list: 
       sdk_list.append(each_sdk) 
    for each_sdk in sdk_list: 
     sdk = AppSdks.objects.get(id=each_sdk) 
     results.append(sdk) 

ответ

1

Последовательный filter.

sdks = AppSdks.objects.all() 
for each_tag in all_tags: 
    sdks = sdks.filter(appsdkstags__tag=each_tag) 

В результате будет создан один запрос, в котором каждый экземпляр AppSdks имеет все необходимые теги.

+0

Это также почти бессрочно более эффективно. –

+0

Тег не является полем в AppSdks. "Не удается разрешить ключевое слово 'тега' в поле Варианты:. Андроид, appsdkstags, company_url, описание, идентификатор, ИОС, логотип, sdk_name, sdk_type" – satjot

+1

SDKs = sdks.filter (appsdkstags__tag = each_tag) – satjot

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