2016-07-12 9 views
0

私は、既存のクエリーセットに新しいオブジェクトを追加する方法や、他の方法で必要なものを実装する方法を探しています。djangoのPythonでクエリーセットを拡張する

contact = watson.filter(contacts, searchline) この行はクエリーセットを返します。これは後で反復するために使用します。

は、その後、私はワトソンのための

contact_in_iteration = Contact.objects.get(id = fild.f_for) 
contact.append(contact_in_iteration) 

そして、申し訳ありませんを見つけることができなかった複数のオブジェクトを追加するためにこれをやってみたい私の下手な英語

んでした。この

contacts = Contact.objects.filter(crm_id=request.session['crm_id']) 
query = Q(contacts,searchline) 
contact = watson.filter(query) 

とget " filter()missing 1必要な位置引数: 'search_text' 'エラー

答えて

0

|およびQルックアップ。 the docsを参照してください。

は、私は完全にあなたの最初のクエリを理解してきたわからないんだけど、私はあなたのケースでは、あなたがやりたいだろうと思う:

query = Q(contacts='Foo', searchline='Bar') 
contact = watson.filter(query) 

を次にそれ以降:厳密に言えば

contact = watson.filter(query | Q(id=field.f_for)) 

クエリーセットには追加されませんが、新しいクエリーセットが返されます。しかし、それは大丈夫です。なぜなら、それはとにかく.filter()です。

+0

私は "連絡"したいと思うquerysetは、この "contact = watson.filter(contacts、searchline)"とこのID "id = fild.f_for"を持つすべてのオブジェクトからすべてのオブジェクトを拘束します。更新された質問文 –

+0

更新された質問と出力から、 '.filter()'に必須の位置引数があるので、 'watson'自体は普通のクエリセットではないようです。アプリケーションコードに 'filter'メソッドが定義されていますか? – nimasmi

0

クエリセットは、後で実行されるSQLクエリとして参照する必要があります。クエリーセットを構築して結果を変数に保存すると、後でそれをさらにフィルタリングできますが、展開することはできません。より特定の規則(OR演算などが必要)を必要とするクエリが必要な場合は、クエリを作成するときにそれを記述する必要があります。これを行う1つの方法は、実際にQオブジェクトを使用することです。

しかし、クエリーセットが本当に何で、どのように使われているのか混乱しているようです。まず第一に:

Contact.objects.get(id = fild.f_for) 

クエリセットを返すことはありませんが、たとえば、あなたがgetを使用するため、単一特定のレコードを要求しているため。クエリを取得するには、filter()を使用する必要があります。既存のクエリセットはactive_contactsを言っていたし、あなたがそうあなただけの「ジョン」のFIRST_NAMEを持っている連絡先を取得し、それを絞り込むしたいのであれば、あなたはどうなる:もちろん

active_contacts = Contact.objects.filter(active=True) 
active_contacts_named_John = active_contacts.filter(first_name='John') 

あなたは1行でこれを行うことができますあまりにも、私はあなたのコードの最初のクエリーセットの構築を行うと仮定しています。

2番目の発言: watsonが質問セットの場合、filter()のユーザーは不明です。これは実際に意味をなさない:

contact = watson.filter(contacts, searchline) 

前述のように、クエリーセットをフィルタリングすると、別のクエリーセットが返されます。したがって、変数名として複数形を使用する必要があります。 contacts。そして、フィルタの正しい使い方は次のようになります。私はここにsearchlineを想定してい

contacts = watson.filter(first_name=searchline) 

は、ユーザ入力された検索語を含む変数です。だから多分ここであなたの変数をsearchtermまたはそれに類するものにするべきです。ワトソンがすでにフィルタリングしていて、first_nameがsearchlineと正確に一致するものによってフィルタリングされたすべての連絡先が返されます。あなたはまた、より多くの方法を解放し、そうのように、検索用語を「含む」という結果をフィルタリング使用することができます

contacts = watson.filter(first_name__contains=searchline) 

希望、これはあなたが正しい道に乗ることができます。

関連する問題