2016-11-28 5 views
0

Djangoには、「accepted_insurance」というManytoManyフィールドを持つモデルがあります。私は保険プロバイダのリストを含むクエリ文字列でgetリクエストを提出するフォームを持っています。 'クエリ文字列リストのアイテムがManytoManyフィールドリストにある場合、これらのオブジェクトをフィルタリングするよりも、'というクエリを作成しようとしています。 'このためのDjangoクエリのショートカットはありますか?私は 'contains'を使用しようとしましたが、関連フィールドに無効な参照があるというタイプエラーがありました。リストにリストが含まれているかどうかはわかりません。Django - リストの項目がManytoManyフィールドにあるオブジェクトを照会します

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クエリ

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

答えて

3

__inあなたがここで必要演算子です。

しかし、他にもいくつか問題があります。まず第一に、querydictをループする必要はありません。それは辞書です、あなたは鍵でアクセスできます。

第2に、現在1つの文字列があります。 split(',')メソッドを使用して文字列のリストに分割する必要があります。

第3に、保険モデルのフィールドに対して実際にフィルタリングする必要があります。おそらく、「名前」フィールドがあります。だから、

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

受け入れ保険は2つのタイトル「ブルークロス・ブルーシールド」を持つオブジェクト、及び「シグナ」を持っているのであれば、それは、これらのタイトルの両方が保険辞書にあるかどうかを確認しようとしますか? – JBT

+0

いいえ。accepted_insuranceフィールドのリストにある名前を持つプロバイダと一致します。 –

+0

素晴らしいです、ありがとうダニエル!クエリショートカットの中には、最初は直感的ではないように聞こえるものもありますが、うまくいけば機能します。 – JBT

関連する問題