Как поймать исключение пустого запроса в Django

Мне нужен элегантный и эффективный подход.

Я делаю запрос к модели, которая имеет шанс вернуть пустой набор запросов, и если это произойдет, я должен сделать запрос с другими параметрами, который будет работать наверняка.

Было бы очень хорошо, если бы я мог поместить запрос внутрь простой попытки, но она не ловится так.

Что меня удерживает от использования .exists(), так это то, что это похоже на то, что я делаю запрос к базе данных два раза. Один раз, чтобы проверить существование, а второй - чтобы действительно получить объект.

Чтобы избежать двойного запроса, вы можете сделать:

objects = models.MyModel.objects.filter(key=value)

if not objects:
    objects = models.MyModel.objects.filter(another_key=another_value)

В этом случае bool(objects) делает не оценку запроса на существование в отличие от использования exists или len()

По документации:

Кроме того, если набор some_queryset еще не был оценен, но вы знаете, что в какой-то момент это произойдет, то использование some_queryset.exists() сделает больше общей работы (один запрос для проверки существования плюс дополнительный запрос для последующего получения результатов), чем использование bool(some_queryset), который получает результаты, а затем проверяет, были ли они возвращены.

https://docs.djangoproject.com/en/4.0/ref/models/querysets/#django.db.models.query.QuerySet.exists

Вернуться на верх