簡體   English   中英

如何在迭代時從Queryset中刪除項目?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM