order_by在SQL中使用Django ORM的给定关系的中间表

时间:2013-03-27 05:26:29

标签: django django-orm

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营养素的数量订购Foods并列出清单:

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;但是,我得到了pks的有序列表,而不是我想要的Food个对象的查询集。

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

1 个答案:

答案 0 :(得分: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')