Цикл на get_object_or_404 останавливается после сбоя условия - PullRequest
2 голосов
/ 09 июля 2019

Я пытаюсь извлечь объекты из модели на основе другой модели:

код

def financials (request):
    finance = list(Quiz.objects.filter(owner=request.user.pk).values_list('id', flat=True))
    print('finance', finance)
    invoice_list = []

    for i in finance:
        print('i',i)

        invoice_object = get_object_or_404(Invoice, invoice_quiz_id=i)
        invoice_list.append(invoice_object)

но он останавливается после одного цикла, потому что он соответствует условию, любая помощь приветствуется.

Вот что я попробовал:

invoice_object = [get_object_or_404(Invoice, invoice_quiz_id=i) for i in finance]

Почему этот цикл просто останавливается, если он соответствует ложному условию? Как сделать так, чтобы оно продолжало нарушать условие?

1 Ответ

4 голосов
/ 09 июля 2019

Почему этот цикл просто останавливается, если он соответствует ложному условию?Как заставить его продолжать сбой из условия?

Идея get_object_or_404(..) [Django-doc] , как говорится в документации:

Вызывает get() на данном менеджере модели, но он повышает Http404 вместо DoesNotExist исключения модели .

Такпо замыслу это вызовет ошибку, если такого объекта не существует или существует несколько объектов.Если вы не хотите этого, вы можете использовать .first() или .filter(..) вместо.

* 1032Как говорится, если вы просто заинтересованы в Invoice объектах, где invoice_quiz относится к Quiz с owner request.user, вы можете определить набор запросов, например:
invoices = Invoice.objects.filter(<b>invoice_quiz__owner=request.user</b>)

Это не только более элегантно, но и более эффективно, поскольку вы сделаете несколько JOIN с на стороне базы данных и, таким образом, получите все Invoice объекты в одном запросе, а не в N + 1. запросов с N числом Quiz zes.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...