2017-06-03 6 views
1

私は2つのクエリーセットを持っていますが、参加したいのですが、どのように処理するのか分かりません。 私はで.filter(total=F('sum'))による結果とフィルタの両方に参加したいのですが、各クエリセットにDjangoクエリーセットに参加してフィルタリングしましょう

モデルのステップ

# Example: 
# Main queryset 
q = Recipe.objects.all() 
ingredients = ['salt','oil','flour','tomato'] 
# This result in all the ingredients necessary 
q1 = q.annotate(total=Count('steps__ingredients__ingredient', distinct=True)) 
# q1 = [{id:1, name: 'salad', total: 5}, {id:2, name: 'pasta', total: 4}] 
# This result in the available ingredients. 
# First I filtered the ingredients I have, them I counted them 
q2 = q.filter(steps__ingredients__ingredient__name__in=ingredients) 
     .annotate(available=Count('steps__ingredients__ingredient',distinct=True)) 
# q2 = [{id:1, name: 'salad', available: 3}, {id:2, name: 'pasta', available: 4}] 

class Recipe(models.Model): 
    name = models.CharField(max_length=50) 
    steps = models.ManyToManyField(StepRecipe) 

class StepRecipe(models.Model): 
    ingredients = models.ManyToManyField(RecipeIngredient) 

class RecipeIngredient(models.Model): 
    ingredient = models.ForeignKey(Ingredient) 

class Ingredient(models.Model): 
    name = models.CharField(max_length=50) 

クエリセットを作成した2つのアノテーションに基づいてデータをフィルタリングします終わり。 これをフィルタリングした結果、ID = 2のオブジェクトのみが表示されます(合計= 4、利用可能= 4)。

私には|オペレータがあります。

result = q1 | q2 

しかし、私はこれを行うたび、注釈の一つは(availableある。この場合の第2四半期の注釈では、最後の1)を消える:私はこのラインで何かをしなければならないと思います。何か案は? DBがそれを行うことができれば、私はそれらを反復したくない。

奇妙なことに、すべてを1行に入れると、期待される結果が得られることがよくあります。私はこれがバグかもしれないという印象を持っています。私がしようとした私は、MySQL 5.6とDjangoに1.11

を使用してい

queryset = Recipe.objects.all() 
     .annotate(total=Count('steps__ingredients', distinct=True)) 
     .filter(steps__ingredients__ingredient__name__in=ingredients) 
     .annotate(sum=Count('steps__ingredients', distinct=True)) 
     .filter(total=F('sum')) 

:私はこれは私がやったことであり、それは正確に数回の結果

...それは何とか結果をキャッシュされたと思いますDjango 1.11の新機能である.intersection()を使用してください。どちらも動作しませんでした(私のDBは明らかにサポートしていません)。私は.union()を使用することを考えましたが、オペレータ|に起こったのと同じことがこの関数に起こりました:1つの注釈が消えました。 1つは消えましたが、私は2回出現したものを見ることができたと思っていました。しかし...もう一度、別のエラー!注釈を付けようとしたときにIndexError: list index out of range

この問題を解決する良い方法(反復ではありません)または未加工のクエリを含まない良い方法があれば、私は感謝します。ありがとう!それはあなたが達成しようとしているかは明らかではありません

+4

を固定されています。モデルを投稿し、取得しようとしているデータを説明してください。 https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – e4c5

+0

あなたはDjangoに参加しません.Djangoはあなたのために参加します。言い換えれば、SQLでDjango ORMの中で最良の結果を得られないと思うならば。 –

+0

目に見える例とモデルを追加しました。私はDjangoが結合を抽象化し、それがナビゲーションと呼ばれることを知っています。それは問題を説明する単なる方法でした – mk2

答えて

関連する問題