[英]How do I remove an item from Queryset while iterating?
我有以下幾點:
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是否具有值本質上是相同的。 reverse
操作不是免費的,並且會影響您的性能,就像切片和切塊一樣。 僅使用exists()
會更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.