Мне нужна помощь в поиске эффективного способа выполнения поискового запроса для набора объектов на основе поля M2M.Моя поисковая форма будет выглядеть примерно как Blue Cross Blue Shield's |Например: это изображение
Теперь предположим, что моя модель выглядит следующим образом:
# models.py
class Provider(models.Model)
title = models.CharField(max_length=150)
phone = PhoneNumberField()
services_offered = models.ManyToManyField(ServiceType)
def __unicode__(self):
return self.title
class ServiceCategory(models.Model):
service_category = models.CharField(max_length=30)
def __unicode__(self):
return self.service_category
class Meta(object):
verbose_name_plural = "Service Categories"
class ServiceType(models.Model):
service_type = models.CharField(max_length=30)
service_category = models.ForeignKey(ServiceCategory)
def __unicode__(self):
return u'%s | %s' % (self.service_category, self.service_type
Кроме того, мы должны помнить, что выбранные нами параметрыМожет быть изменено, поскольку их отображение в форме является динамическим (новые ServiceCategories и ServiceTypes могут быть добавлены в любое время).* Как мне следует построить запрос для объектов Провайдера, если человек, использующий форму поиска, может выбрать несколько Services_Offered? *
В настоящее время это мой крайне неэффективный метод:
#managers.py
from health.providers.models import *
from django.db.models import Q
class Query:
def __init__(self):
self.provider_objects=Provider.objects.all()
self.provider_object=Provider.objects
self.service_object=ServiceType.objects
self.category_objects=ServiceCategory.objects.all()
def simple_search_Q(self, **kwargs): #matt's learning note: **kwargs passes any dictionary
return self.provider_objects.filter(
Q(services_offered__service_type__icontains=kwargs['service']),
Q(title__icontains=kwargs['title']),
Q(state=kwargs['state']),
).distinct().order_by('title')
====================
#views.py
from django.shortcuts import render_to_response
from health.providers.models import *
from health.search.forms import *
from health.search.managers import Query #location of the query sets
from django.core.paginator import Paginator, InvalidPage, EmptyPage
from django.template import RequestContext
def simple_search(request):
if request.method == 'POST':
SimpleSearch_form = SimpleSearch(request.POST)
if SimpleSearch_form.is_valid():
request.session["provider_list"] = None
kwargs = {'title': request.POST['title'],
'service': request.POST['service'], 'state': request.POST['state'] }
provider_list = Query().simple_search_Q(**kwargs)
return pagination_results(request, provider_list)
else:
SimpleSearch_form = SimpleSearch()
return render_to_response('../templates/index.html', { 'SimpleSearch_form': SimpleSearch_form},
context_instance=RequestContext(request))
Как мне сделать мой запрос:
Получение объектов провайдера на основе выбора нескольких запросов.POST ['service']
Более эффективный
Спасибо за любую помощь в продвинутом.
С наилучшими пожеланиями, Мэтт