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)
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
Nein. Es wird mit jedem Anbieter übereinstimmen, der einen der Namen in der Liste im Feld accept_insurance hat. –
Super, danke Daniel! Einige der Abfragebefehle klingen zunächst etwas kontra intuitiv, aber wenn es funktioniert, funktioniert es. – JBT