如何在迭代时从Queryset中删除项目?

时间:2016-01-20 00:54:17

标签: python django django-queryset

我有以下内容:

jobs = Task.objects.filter(created__month=month, created__year=year)

for job in jobs:
    try:
        _ = User.all_objects.filter(user=job.creator_id, customer=job.customer_id).reverse()[0]
    except IndexError:
        # Remove this job
        job.delete()  # This is deleting object from the Database which I don't want to happen. 
        # I'm looking for a method such as jobs.remove(job)

从上面,我不知道是否可以在我的第一个查询中使用'exclude'。这就是为什么我想知道是否有办法从Queryset中删除'job'。

2 个答案:

答案 0 :(得分:1)

QuerySet的主要吸引力在于它是懒惰的,但无论如何你都在评估所有内容,所以如果你做的话,我不会认为你会失去任何东西它是一个列表理解列表。

jobs = [j for j in jobs if  User.all_objects.filter(user=job.creator_id, customer=job.customer_id)]

答案 1 :(得分:0)

嗯,你可以一次性delete。只需收集您需要的所有工作ID:

jobs = Task.objects.filter(created__month=month, created__year=year)

to_be_deleted = []
for job in jobs:
    if not User.all_objects.filter(user=job.creator_id, 
                                   customer=job.customer_id).exists():
    to_be_deleted.append(job.id)

jobs.filter(id__in=to_be_deleted).delete()

ps:我不太明白为什么你有reverse()[0],但它与检查queryset是否有值基本相同。 reverse不是免费的,会影响你的表现,切片和切块也是如此。只需使用exists()会更好。