4

models.py:

class Ingredient(models.Model):
    _est_param = None

    param = models.ManyToManyField(Establishment, blank=True, null=True, related_name='+', through='IngredientParam')

    def est_param(self, establishment):
        if not self._est_param:
            self._est_param, created = self.ingredientparam_set\
                .get_or_create(establishment=establishment)
        return self._est_param

class IngredientParam(models.Model):
    #ingredient params
    active = models.BooleanField(default=False)
    ingredient = models.ForeignKey(Ingredient)
    establishment = models.ForeignKey(Establishment)

のパラメータを使用してすべての材料を取得する必要がありEstablishmentます。まず、のようなすべてのパラメータをフェッチIngredients.objects.all()して使用しますIngredients.objects.all()[0].est_param(establishment).active。django 1.4 prefetch_relatedを使用してSQLクエリを減らすにはどうすればよいですか?の個々のEstablishmentプロパティを保存するために他の方法を使用できるかもしれIngredientませんか?

4

2 に答える 2

4

Django 1.7 は、 prefetch_relatedに入れることができるPrefetchオブジェクトを追加します。フィルタリングを提供するクエリセットを指定できます。現時点では、リストから単一の (最新の) エントリを取得する際に問題が発生していますが、関連するすべてのエントリを取得しようとすると非常にうまく機能するようです。

また、この質問の一部であるdjango-prefetchをチェックアウトすることもできますが、これは文言が大きく異なるため、この質問と重複しているようには見えません。

于 2014-06-22T19:32:03.127 に答える
3

次のコードは、2 つのクエリですべての成分とそのパラメーターを取得します。

ingredients = Ingredients.objects.all().prefetch_related('ingredientparam_set')

その後、さらにデータベース クエリを実行することなく、関心のあるパラメーターにアクセスできます。

于 2012-06-18T02:44:21.813 に答える