web-dev-qa-db-ja.com

Djangoクエリの否定

DjangoでフィルターとQオブジェクトを作成する方法は知っていますが、APIが提供する演算子を無効にする方法がわかりません。たとえば、contains演算子の場合、notcontainsのようなものが必要です。

例えば.

q=Q(name__notcontains="SomeString")

これにより、名前に「SomeString」が含まれていないすべてのオブジェクトが取得されます。

私が見逃している構文はありますか?

ありがとうございました。

31
Daniel Gollás

exclude()の代わりに filter() を使用できます。

Entry.objects.exclude(name__contains="SomeString")

( "namesに" SomeString "が含まれているものを除くすべてのエントリを教えてください)

また、Qオブジェクトを処理する場合は、Qオブジェクトの前に「〜」記号を使用して否定を表すことができます。たとえば、次のステートメントは、「namesが「Elephant」を含み、「SomeString」を含まないすべてのエントリを提供してください」という意味です。

Entry.objects.filter(Q(name__contains="Elephant") & ~Q(name__contains="SomeString"))

場合によっては、両方の方法を使用することをお勧めします。

Entry.objects.exclude(Q(name__contains="Elephant") & ~Q(name__contains="SomeString"))

(「namesに「Elephant」が含まれているが「SomeString」が含まれていないエントリを除く、すべてのエントリを教えてください)

61
Ludwik Trammer

これが QuerySet APIリファレンス です。 exclude あなたがやりたいことをしているようです。

3
Hank Gay

ハンクが示唆するようにexcludeを使用するか、特定のcontainsの場合、本当にfilterを使用する必要がある場合は、Q(name__regex = r '!(SomeString)')を使用します。 regexはデータベースに依存しないことに注意してください。最初に、データベースがサポートする構文を確認してください。

2
kibitzer