J'ai besoin d'aide pour trouver une manière efficace de faire une requête de recherche pour un ensemble d'objets, basé sur un Champ M2M. Mon formulaire de recherche va ressembler à Blue Cross Blue Shield | par exemple: this imageDjango: Comment faire une requête pour un objet basé sur un champ M2M (plusieurs sélections pour le champ sur le formulaire de recherche)
Maintenant, supposons que mon modèle ressemble à ceci:
# 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
De plus, nous devons garder à l'esprit que les options que nous choisissons sont sujets à changement, étant donné que leur affichage sur le formulaire est dynamique (de nouveaux ServiceCategories et ServiceTypes peuvent être ajoutés à tout moment). ? * Comment devrais-je aller à la construction d'une requête pour les objets du fournisseur, étant donné qu'une personne utilisant le formulaire de recherche sélectionner plusieurs Services_Offered *
Ceci est actuellement mon HAUTEMENT INEFFICACES MÉTHODE:
#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))
Comment puis-je faire ma requête:
Obtenir des objets fournisseur basé sur la sélection de plusieurs request.POST [ 'service']
plus efficace
Merci pour toute aide à l'avance.
Cordialement, Matt
Comment définissez-vous votre formulaire de recherche? Utilisez-vous un 'ModelMultipleChoiceField' pour la liste des fournisseurs? –
J'utilise les bibliothèques django-mptt pour générer mon formulaire dynamique. Voici un bon exemple qui explique comment l'utiliser http://django-mptt.github.com/django-mptt/forms.html#treenodechoicefield – Matt