2017-02-21 10 views
0

属性がNoneまたは空の文字列に設定されているモデルのインスタンスをすべて検索しようとしています。私は、ORMの__inクエリについて何か不足していると思います。私はIntegerFieldとでこれを行うと、Noneまたは空の文字列を使用しない場合"Q"と "__in"のDjango ORMクエリの結果が一致しません

TextBlock.objects.filter(content='').count() 
>185 
TextBlock.objects.filter(content=None).count() 
>235 
TextBlock.objects.filter(content__in=['', None]).count() 
>185 
TextBlock.objects.filter(Q(content='')|Q(content=None)).count() 
>420 
TextBlock.objects.filter(content__in=[None, '']).count() 
>185 

は、私が取得:

TextBlock.objects.filter(order=1).count() 
> 575046 
TextBlock.objects.filter(order=2).count() 
> 11946 
TextBlock.objects.filter(order__in=[1,2]).count() 
> 586992 

これは私が期待するものです。私はTextBlock.objects.filter(content__in=['', None]).count()に420の結果を返すと間違っていましたか?もしそうなら、なぜですか?

Qクエリーは私が望むことをしますので、私はそれに行き着きますが、なぜ3番目のクエリーが私が望んだことをしなかったのか不思議です。

ありがとうございます!

EDIT:それは違いますが、コンテンツフィールドはmodels.TextFieldであり、コンテンツは、あなたが比較を使用しないでくださいNoneの場合、注文フィールドがチェックのためにmodels.IntegerField

答えて

2

注意SQLでは実際にはfalseで、値がnullかどうかを確認するにはIS NULLを使用する必要があります。 DjangoはQ(content=None)IS NULLのステートメントに変換するほどスマートです。そのため、TextBlock.objects.filter(Q(content='')|Q(content=None)).count()が期待する結果を返します。

ステートメントは、値を要素と比較することしかできません。IS NULLのチェックはできません。ヌル値をチェックするには、content=Noneまたはそれに相当するcontent__isnull=Trueを明示的に追加する必要があります。

__inを使用するクエリは、NULLが含まれていない値の一覧では正常に動作するはずです。

0

であるかどうかわかりません。 あなたはisnullフィールドルックアップを使用してNone値をチェックあなたはORM でcontent__isnullを使用する必要があります(とあなたがやっているようにあなたは、Qオブジェクトにクエリを組み合わせることができます)

0

NULL == NULLこと

TextBlock.objects.filter(Q(content='')|Q(content__isnull=True)).count() 
関連する問題