2017-08-03 60 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))