如何检索由其他对象的字段筛选和排序的一组对象,其中所需对象是外键?

时间:2016-02-21 23:09:37

标签: django python-3.x django-templates django-queryset

将标题重新改写为我的问题的上下文:如何检索一组食物,按其他对象的字段筛选和排序,食物对象是外键?

我有以下型号:

class Food(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=200, blank=True)

class DayOfFood(models.Model):
    user = models.ForeignKey(User)
    date = models.DateField()
    unique_together = ("user", "date")

class FoodEaten(models.Model):
    day = models.ForeignKey(DayOfFood, on_delete=models.CASCADE)
    food = models.ForeignKey(Food, on_delete=models.CASCADE)
    servings = models.FloatField(default=1)

我希望能够检索给定用户最近吃的食物。这个食物集合将被传递给模板,因此它必须是一个QuerySet,以允许模板循环遍历食物对象。

这是我走了多远

days = DayOfFood.objects.filter(user=request.user)
foodeatens = FoodEaten.objects.filter(day__in=days)
foodeatens = foodeatens.order_by('day__date')

现在感觉我几乎就在那里,我想要的所有食物都包含在生成的QuerySet中的FoodEaten对象中。我不知道如何使用" for ... in:"获取食物对象并仍将它们存储在QuerySet中。有没有办法执行foreach或映射到QuerySet?

我不想重写模板来接受FoodEaten对象,因为模板被其他视图使用,只是将食物对象传递给模板。

解决方案

Shang Wang的回答帮助我编写了解决我问题的代码:

days = DayOfFood.objects.filter(user=request.user)
foods = Food.objects.filter(
  foodeaten__day__in=days,
  foodeaten__day__user=request.user) \
  .order_by('-foodeaten__day__date')

1 个答案:

答案 0 :(得分:1)

可以使用关系链来完成:

Food.objects.filter(foodeaten__day__in=days,
                    foodeaten__day__user=request.user) \
            .order_by('foodeaten__day__date')

顺便说一下,我不确定为什么你会在多个模型userFoodDayOfFood。如果你真的需要两者之间的用户关系,也许在每个模型中使用用户的角色使字段名称更明确,否则你会很快感到困惑。