0
class Nutrient(models.Model):
    tagname = models.CharField(max_length=10)


class FoodNutrientAmount(models.Model):
    nutrient = models.ForeignKey(Nutrient)
    food = models.ForeignKey(Food)
    amount = models.FloatField()


class Food(models.Model):
    nutrients = models.ManyToManyField(
        Nutrient,
        through=FoodNutrientAmount,
    )

tagname=FOLしたがって、リスト内包表記を使用して、栄養素の量で注文された食品を取得できます。

ordered_fnas = FoodNutrientAmount.objects.filter(
    nutrient__tagname="FOL"
).order_by('-amount')
ordered_foods_by_most_fol = [fna.food for fna in ordered_fnas]

すべてをメモリに入れずに、クエリセットのような反復可能なものを取得できますか?

たぶん、またはを使用して別のアプローチがありますFood.objects.annotateextra?現時点では、それを行うための優れた方法を考えることはできません。

私はvalues_listに近づくことができます。しかし、必要なオブジェクトのクエリセットではなく、pkの順序付きリストを取得しFoodます。

FoodNutrientAmount.objects.filter(
    nutrient__tagname='FOL'
).order_by('-amount').v‌​alues_list('food', flat=True)
4

1 に答える 1

1

編集:

これは多対多の関係です。したがって、おそらくそれを活用できます。デフォルトの順序をに追加してFoodNutrientAmount、通常の多対多クエリを実行するのはどうですか。

class FoodNutrientAmount(models.Model):
    nutrient = models.ForeignKey(Nutrient)
    food = models.ForeignKey(Food)
    amount = models.FloatField()

    class Meta:
        ordering = ('-amount',)

その後、あなたはただ呼び出すことができます-

nutritious_foods = Food.objects.filter(nutrients__tagname='FOL').order_by('foodnutrientamount')
于 2013-03-27T05:44:17.160 に答える