2010-12-23 60 views
1

我需要幫助提出一種有效的方式來爲一組對象執行搜索查詢,基於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 [ '服務']

  • 更高效

  • 感謝級

    1. 獲取供應商的對象。

      最好的問候, 馬特

    +0

    如何定義搜索表單?你是否使用`ModelMultipleChoiceField`作爲提供者列表? – 2010-12-23 19:28:37

    +0

    我使用django-mptt庫來生成我的動態表單。這是一個很好的例子,解釋瞭如何使用它http://django-mptt.github.com/django-mptt/forms.html#treenodechoicefield – Matt 2010-12-23 21:15:09

    回答

    1

    1:多request.POST [ '服務'],我假設你的意思是這些的複選框。

    我會使CheckBox值的ID,而不是名稱,並進行PK查找。

    'services_offered__pk__in': request.POST.getlist('service') 這將返回所有已選擇服務的所有Provider對象。

    PS:您還在使用CapitalCase作爲非常令人困惑的實例。如果你希望你的代碼是可讀的,我強烈建議對你的風格進行一些改變(不要使用實例或變量的CapitalCase),並使你的變量更具描述性。

    SimpleSearch_form = SimpleSearch() # what is SimpleSearch? 
    simplesearch_form = SimpleSearchForm() # now, it's very clear what the class SimpleSearchForm is 
    # and the form instance is clearly a for instance. 
    

    2:使它更有效率?您可以通過刪除整個Query類來擺脫很多代碼和代碼分離。另外,我不知道你爲什麼使用Q對象,因爲你沒有做任何需要它的事情(比如OR或OR + AND)。

    def simple_search(request): 
        if request.method == 'POST': 
         searchform = SimpleSearchForm(request.POST) 
    
         if searchform.is_valid(): 
          request.session['provider_list'] = None 
          post = request.POST 
          providers = Provider.objects.filter(services_offered__pk__in=post.getlist('services'), 
           title=post['title'], state=post['state']) 
          return pagination_results(request, provider_list) 
        else: 
         searchform = SimpleSearchForm() 
    
        return direct_to_template(request, '../templates/index.html', { 'searchform': searchform}) 
    
    相關問題