私は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
この問題を解決する良い方法(反復ではありません)または未加工のクエリを含まない良い方法があれば、私は感謝します。ありがとう!それはあなたが達成しようとしているかは明らかではありません
を固定されています。モデルを投稿し、取得しようとしているデータを説明してください。 https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – e4c5
あなたはDjangoに参加しません.Djangoはあなたのために参加します。言い換えれば、SQLでDjango ORMの中で最良の結果を得られないと思うならば。 –
目に見える例とモデルを追加しました。私はDjangoが結合を抽象化し、それがナビゲーションと呼ばれることを知っています。それは問題を説明する単なる方法でした – mk2