QuerySetを使用する理由。非ゼロは非効率的な実装を持っていますか?.existsとは異なる何かを達成しようとしていますか?Django開発者がゼロ以外の=存在しない理由は何ですか?
exists
それは特定の状況下でのみ効率的だからだと思います。
__nonzero__
「効率的な」実装があった場合、この一般的なシナリオを想像してみてください。
foos = Foo.objects.filter(bar='baz')
if foos: # nonzero() calls exists() which causes extra query
# even though the QS is already going to be evaluated
# which in my projects is a common pattern.
print "Yay for foos!"
for foo in foos:
print foo
__nonzero__
また、クエリを評価し、結果をキャッシュに保存します。つまり、すべての結果がメモリに保存されます。
exists
気にするのは1行だけで、djangoオブジェクトをインスタンス化したり、その結果をキャッシュに保存したりすることもありません。
何かが存在するかどうかをチェックするだけで、データをまったく必要としない場合に便利です。
なぜ開発者は__nonzero__
==を作らないのexists
ですか?
exists
結果を気にしないと仮定しているからです。__nonzero__
と呼ばれた場合exists
、結果はありません。exists
と呼ばれる場合__nonzero__
、行が存在するかどうかを確認するためだけに結果(場合によっては大量)を収集します。
例:
bool( Foo.objects.filter(user=user) )
# calls __nonzero__, evaluates, converts all fields to python objects
# and stores in queryset._result_cache
Foo.objects.filter(user=user).exists()
# stores nothing, and query only returns one row.
# less data from DB and less python overhead generating django model instances.