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.annotateor extra?目前我想不出一个很好的方法来做到这一点。

我可以接近 values_list;但是,我得到了 pks 的有序列表,而不是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 回答