Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 迭代时如何从Queryset中删除项?_Python_Django_Django Queryset - Fatal编程技术网

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

Python 迭代时如何从Queryset中删除项?,python,django,django-queryset,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

我有以下资料:

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)

从上面看,我不知道是否可以在我的第一个查询中使用“排除”。这就是为什么我想知道是否有一种方法可以从Queryset中删除“job”。

Queryset的主要吸引力在于它很懒,但不管怎样,你都在评估一切,所以我认为如果你只是用列表理解来做一个列表,你不会损失任何东西

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

嗯,你可以一次完成
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是否有值基本相同<代码>反向不是免费的,会损害您的性能,切片和切割也是如此。只需使用
exists()
就更好了。

很难猜测您打算做什么。如果您只想跳过引发
索引器的作业,继续下一个作业,只需使用
continue
语句即可。如果要在python中过滤列表,请使用带有
If
的列表理解。如果您想做其他事情,请给出更好的问题描述。这实际上会从数据库中删除对象,而提出问题的人明确表示不想这样做。我认为这篇文章中有一个更好的答案: