迭代时如何从Queryset中移除项?

2024-04-27 15:13:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下资料:

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”。


Tags: inidfortaskobjectsjobsjobcustomer
2条回答

好吧,你可以一次性完成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()

注:我不太明白为什么要有reverse()[0],但这与检查queryset是否有值基本相同。reverse不是免费的,而且会损害您的性能,与切片和切割相同。使用exists()会更好。

一个QuerySet的主要吸引力是它很懒,但是不管怎样,你都在评估每件事,所以我认为如果你只是把它列为一个有列表理解力的列表,你不会失去任何东西。

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

相关问题 更多 >