Забытый DoesNotExist
Анти-паттерн
При вызове метода QuerySet.get() может оказаться, что искомой записи в БД не будет, и возникнет исключение DoesNotExist, а программа завершится с исключением.
В данном случае пользователь просто не получит желаемый продукт и программа продолжит работать.
Пример 1¶
В данном случае исключение DoesNotExist берётся прямо из используемой модели.
Плохо:
product = Product.objects.get(id=product_id)
Хорошо:
def get_product(product_id):
try:
product = Product.objects.get(id=product_id)
except Product.DoesNotExist:
logger.error(f'Продукт с id={product_id} не сущуствует.')
product = None
return product
Пример 2¶
Здесь используется общее для всех моделей исключение ObjectDoesNotExist.
Плохо:
product = Product.objects.get(id=product_id)
Хорошо:
from django.core.exceptions import ObjectDoesNotExist
def get_product(product_id):
try:
product = Product.objects.get(id=product_id)
except ObjectDoesNotExist:
logger.error(f'Продукт с id={product_id} не сущуствует.')
product = None
return product
Пример 3¶
В случае отсутствия объекта в БД get_object_or_404 поднимает исключение Http404, которое вернёт 404 ошибку, сообщив, что такой страницы не существует.
Плохо:
def view_product(request, product_id):
product = Product.objects.get(id=product_id)
...
render(request, 'product.html', context=context)
Хорошо:
from django.shortcuts import get_object_or_404
def view_product(request, product_id):
product = get_object_or_404(Product, id=product_id)
...
render(request, 'product.html', context=context)