我想基于一些检查从查询列表中排除一些对象 - 第一个是检查每个项目是否已“过期”的简单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列表'过滤'对象的正确方法是什么?
答案 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中的filter
或exclude
函数,您只需在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))