2011-11-10 4 views
2

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のバグですか?

+1

SQL Djangoの出力を読むことができるように、Querysetのクエリ属性を出力することができます。 –

+0

問題が 'is_bulk = True'、' num_components = 0'、またはそれらを一緒に使用しているかどうかを確認するために、一度に一つのパラメータでexcludeを試すことができます。 – Lycha

+0

あなたのmodels.py 'parent = models.ForgeinKey(Type)'にタイプミスがあります。それはForeignKey –

答えて

1

私はクエリセットを変更することで、これを修正した:働く

types_qs.annotate(num_components=Count('components')).filter(Q(is_bulk=False) | (Q(is_bulk=True) & Q(num_components__gt=0))) 

が、私のオリジナルのものがなかった理由を私は見ることができません。まぁ。

0

私はこの例を試してみましたが、私はあなたの分野でrelated_nameを宣言していると思う必要なもの:

それをあなたの例に基づいて

UPDATE

を行う必要があります

class Component(models.Model): 
    parent = models.ForgeinKey(Type, related_name='components') 

>>> [(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)] 

そして鉱山:

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, 3), (False, 0), (False, 1), (False, 4), (True, 2), (True, 3), (True, 1), (True, 1), (False, 2), (True, 7), (True, 0), (False, 0)] 

[] 

これを結果では、私の場合:

[<Type: Type object>, <Type: Type object>, <Type: Type object>, <Type: Type object>] 
+0

でなければなりません私は既に私のモデルでそれを行い、問題が発生しています。私は質問を更新しました – Rory

+0

私は私の答えも更新しました –

関連する問題