从for中的Django查询列表中删除对象

时间:2017-08-03 10:34:27

标签: python django

我想基于一些检查从查询列表中排除一些对象 - 第一个是检查每个项目是否已“过期”的简单for循环。但是,当我这样做时,它会返回所有对象。

now = datetime.datetime.now()
food = Food.objects.filter(user=self.user, in_cupboard=True)

          for f in food:
              if (f.cupboard.close_date + timedelta(days=1)) < now:
                  f.exclude(pk=f.id)

使用for列表'过滤'对象的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

在您的示例中,问题是您从food中排除了应该从valid_food = food for f in food: if (f.cupboard.close_date + timedelta(days=1)) < now: valid_food = valid_food.exclude(pk=f.id) 中排除该项目的项目,还需要存储新的查询集,例如:

today = datetime.date.today()
food = Food.objects.filter(
    user=self.user,
    in_cupboard=True,
    close_date__gt=today,
)

但过滤只能用django ORM完成,如下所示:

#include

答案 1 :(得分:2)

为什么不使用django查询的排除

now = datetime.datetime.now()
food = Food.objects.filter(user=self.user, in_cupboard=True).exclude(expires_at__lt = now)

答案 2 :(得分:0)

考虑到您只想制作一个列表而不使用django中的filterexclude函数,您只需在python中使用列表过滤器。

now = datetime.datetime.now()
food = Food.objects.filter(user=self.user, in_cupboard=True)
new_list = list(filter(lambda x: (x.cupboard.close_date + timedelta(days=1)) < now, food))