2016-01-20 4 views
0

У меня есть следующие:Как удалить элемент из 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) 

Из выше, я не знаю, если это возможно использование «исключить» в моем 1-ом запросе. Вот почему мне интересно, есть ли способ удалить «работу» из Queryset.

+0

Трудно угадать, что вы намереваетесь сделать. Если вы просто хотите пропустить задание, которое вызывает «IndexError», продолжить со следующего, просто используйте оператор 'continue'. Если вы хотите отфильтровать список в python, используйте понимание списка с 'if'. Если вы хотите сделать что-то еще, дайте лучшее описание проблемы. –

ответ

1

Основная привлекательность QuerySet заключается в том, что она ленива, но вы все оцениваете, несмотря ни на что, поэтому я не думаю, что вы потеряете что-либо, если бы вы просто составили список со списком.

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

Ну, вы можете сделать delete одним выстрелом. Просто собрать все идентификаторы задания вам нужен первый:

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() было бы лучше.

+0

Это фактически удалит объекты из базы данных, которые человек, явно задающий вопрос, не хочет. –

+0

Я думаю, что в этом посте лучше ответить: https://stackoverflow.com/a/3032479/515093 –

Смежные вопросы