this SO question about counting forgein keysに基づいて、私は問題があります。これは私のモデルである:Django QuerySetとexclude&annotateが結果を返さない
class Type(models.Model):
is_bulk = models.BooleanField()
class Component(models.Model):
parent = models.ForgeinKey(Type, related_name="components")
私は=真is_bulkと何の部品を持っていなかったものを除き、すべてのタイプを持っているクエリセットを書きたいです。 is_bulk = Falseの場合は、それを含める必要があります。 is_bulk = Trueで、リンクされているコンポーネントが1つ以上ある場合は、含まれています。そうでない場合、あなたは除外されます。答えをオフに基づいて
は、私はこのクエリセットしようとした:
Type.objects.annotate(num_components=Count('components')).exclude(is_bulk=True, num_components=0)
をしかし、それは結果を返しません。
しかし、これは結果が存在すべきであることを意味します
>>> [(x.is_bulk, x.num_components) for x in Type.objects.annotate(num_components=Count('components'))]
[(False, 0), (False, 0), (False, 0), (False, 0), (False, 0), (False, 0), (False, 0)]
すべてのタイプのオブジェクトは0コンポーネントを持っている= Falseにし、それらのすべてをis_bulkています。 the .exclude(…) documentationを読むと、それはNOT(is_bulk=True AND num_components=0)
でなければなりません。これはすべてのタイプに対して真でなければなりません。右? (私はここに誤解を犯しましたか?そうなら、正しいクエリーセットは何ですか)
もしそうでなければ、このクエリーセットはすべて返すべきときに[]
を返すのはなぜですか?これはDjango 1.3のバグですか?
SQL Djangoの出力を読むことができるように、Querysetのクエリ属性を出力することができます。 –
問題が 'is_bulk = True'、' num_components = 0'、またはそれらを一緒に使用しているかどうかを確認するために、一度に一つのパラメータでexcludeを試すことができます。 – Lycha
あなたのmodels.py 'parent = models.ForgeinKey(Type)'にタイプミスがあります。それはForeignKey –