Как поймать исключение пустого запроса в 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