web-dev-qa-db-ja.com

Djangoブールクエリセットフィルターが機能しない

これは、1時間の大部分の間私を苛立たせてきました。

私は次のモデルを持っています:

sold= models.BooleanField(default=False)

そして、次のビューコード:

properties = Property.objects.filter(sold=False).order_by('-created_on');

そして私のsqlite3データベースの次の値:

 sqlite> select sold from clients_property;
1
1
1
1
1

そして、次のテンプレートコードは機能します(のように、販売されたアイテムを非表示にします):

{% if not property.sold %}

クエリセットフィルターが機能しない理由、または私が間違っている理由を誰かが知っていますか?私はもう試した:

sold="1"
sold=1
sold="false"
sold=False
sold="False"
14
John Peebles

あなたが投稿したものから、すべてが宣伝どおりに機能しています。シェルからこのようなものを試してみると、次の結果が得られるはずです。もちろん、私はそれのいくつかを作り上げているので、コピーして貼り付ける前に読んでください。

>>> from myapp.models import Property
>>> Property.objects.all()
[<Property: Property object>,<Property: Property object>,<Property: Property object>,<Property: Property object>,<Property: Property object>,]
>>> Property.objects.filter(sold=False)
[]
>>> Property.objects.filter(sold=True)
[<Property: Property object>,<Property: Property object>,<Property: Property object>,<Property: Property object>,<Property: Property object>,]
>>> Property.objects.create(sold=False, my='other', fields=1)
>>> Property.objects.filter(sold=False)
[<Property: Property object>,]

ジャックは正しいです。ほとんどのSQL実装では1がTrueと評価されるはずです。

13
Issac Kelly

これは私にも起こりました。

SQLiteで判明したのは、値0のブール値と値Falseのブール値を持つことができるということです。

したがって、Djangoは、Falseに設定されているものでは機能しません

私はsqlitemanでこの不一致を見ました

簡単な更新で問題が修正されました。

これは、開発環境でのスキーマのアップグレードと移行中に発生したと思うので、それほど心配する必要はありません。

19
Kiril

私も同じ問題を抱えていました。私の解決策は、列のタイプを「ビット」から「tinyint」に変更することでした。

私の場合の問題は、テーブルに手動で追加された列が原因でした。

1
The Doc