将标题重新改写为我的问题的上下文:如何检索一组食物,按其他对象的字段筛选和排序,食物对象是外键?
我有以下型号:
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')
答案 0 :(得分:1)
可以使用关系链来完成:
Food.objects.filter(foodeaten__day__in=days,
foodeaten__day__user=request.user) \
.order_by('foodeaten__day__date')
顺便说一下,我不确定为什么你会在多个模型user
和Food
上DayOfFood
。如果你真的需要两者之间的用户关系,也许在每个模型中使用用户的角色使字段名称更明确,否则你会很快感到困惑。