2016-11-28 1 views
0

Ich habe ein Modell in Django, die ein ManytoMany-Feld namens "accepted_insurance" hat. Ich habe ein Formular, das eine Anfrage mit einem Abfrage-String, der eine Liste von Versicherungsträgern enthält, übermittelt. Ich versuche, eine Abfrage zu schreiben, die besagt: "Wenn eines der Elemente aus der Abfragezeichenfolgenliste in der Feldliste von ManytoMany enthalten ist, dann filtern Sie diese Objekte." Gibt es dafür eine Django Query Shortcut? Ich habe versucht, 'contains' zu verwenden, aber ich habe einen Typfehler bekommen, dass das zugehörige Feld eine ungültige Suche erhalten hat, und ich bin mir sicher, das würde einfach sagen, wenn die Liste die Liste enthielt.Django - Abfrage für alle Objekte, wo ein Element aus der Liste ist in ManytoMany Feld

models.py

class Provider(models.Model): 
    title = models.CharField(max_length=255, null=True, blank=True) 
    first_name = models.CharField(max_length=255, null=True, blank=True) 
    middle_name = models.CharField(max_length=255, null=True, blank=True) 
    last_name = models.CharField(max_length=255, null=True, blank=True) 
    email = models.EmailField(null=True, blank=True) 
    phone = models.CharField(max_length=40, null=True, blank=True) 
    extension = models.CharField(max_length=10, null=True, blank=True) 
    company = models.CharField(max_length=255, null=True, blank=True) 
    age = models.IntegerField(null=True, blank=True) 
    about = models.TextField(default='', null=True, blank=True) 
    position = models.CharField(max_length=255, null=True, blank=True) 

    cost_per_session = models.CharField(max_length=255, null=True, blank=True) 
    accepts_insurance = models.BooleanField(default=False) 
    accepted_insurance = models.ManyToManyField('Insurance', blank=True) 
    payment_methods = models.ManyToManyField('PaymentMethod', blank=True) 

request.GET

http://localhost:8004/directory/?search=timothy&insurance=cigna,aetna,optum_health,united_behavioral,blue_cross_blue_shield 

<QueryDict: {'insurance': ['cigna,aetna,optum_health,united_behavioral,blue_cross_blue_shield'], 'search': ['timothy']}> 

views.py Abfrage

for param in request.GET: 
    if param.lower() == 'insurance': 
     all_providers = all_providers.filter(accepted_insurance__contains=param) 

Antwort

3

__in ist der Betreiber Sie hier benötigen.

Allerdings haben Sie ein paar andere Probleme. Erstens besteht keine Notwendigkeit, das Querydikt zu durchlaufen; Es ist ein Diktat, Sie können es per Schlüssel aufrufen.

Zweitens haben Sie derzeit eine einzige Zeichenfolge; Sie müssen es in eine Liste von Strings mit der split(',')-Methode aufteilen.

Drittens müssen Sie tatsächlich gegen ein Feld auf dem Insurance-Modell filtern - vermutlich hat es ein "Name" -Feld.

So:

insurance = request.GET.get('insurance', '').split(',') 
all_providers = all_providers.filter(accepted_insurance__name__in=insurance) 
+0

Also, wenn angenommene Versicherung zwei Objekte mit dem Titel ‚Blue Cross Blue Shield‘ hat und ‚Cigna‘, wird es versuchen, um zu sehen, ob diese beiden Titel im Versicherungs Wörterbuch sind? – JBT

+0

Nein. Es wird mit jedem Anbieter übereinstimmen, der einen der Namen in der Liste im Feld accept_insurance hat. –

+0

Super, danke Daniel! Einige der Abfragebefehle klingen zunächst etwas kontra intuitiv, aber wenn es funktioniert, funktioniert es. – JBT

Verwandte Themen