我需要幫助提出一種有效的方式來爲一組對象執行搜索查詢,基於M2M領域。我的搜索表單將會看起來像Blue Cross Blue Shield的|例如:this imageDjango:如何基於M2M字段在對象上進行查詢(多個搜索表單上的字段選擇)
現在,讓我們假設我的模式是這樣的:
# 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))
我怎樣才能讓我的查詢:
基於對先進任何幫助選擇多個request.POST [ '服務']更高效
感謝級
獲取供應商的對象。
最好的問候, 馬特
如何定義搜索表單?你是否使用`ModelMultipleChoiceField`作爲提供者列表? – 2010-12-23 19:28:37
我使用django-mptt庫來生成我的動態表單。這是一個很好的例子,解釋瞭如何使用它http://django-mptt.github.com/django-mptt/forms.html#treenodechoicefield – Matt 2010-12-23 21:15:09