2017-08-03 65 views
0

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

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) 

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

回答

3

在您的例子,问题是,你从f排除的项目,你应该从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) 

但是滤波可以做只有Django的ORM,像这样:

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

你为什么不使用排除Django的查询

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

不幸的是,不相信我能做到这一点,因为它的财产 – NickP

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))