Независимо от того, выполняете ли вы это с помощью менеджера или универсальной функции, вы также можете захотеть перехватить 'MultipleObjectsReturned' в операторе TRY, поскольку функция get () будет вызывать это, если ваши kwargs получат более одного объекта.
Опираясь на обобщенную функцию:
def get_unique_or_none(model, *args, **kwargs):
try:
return model.objects.get(*args, **kwargs)
except (model.DoesNotExist, model.MultipleObjectsReturned), err:
return None
и в менеджере:
class GetUniqueOrNoneManager(models.Manager):
"""Adds get_unique_or_none method to objects
"""
def get_unique_or_none(self, *args, **kwargs):
try:
return self.get(*args, **kwargs)
except (self.model.DoesNotExist, self.model.MultipleObjectsReturned), err:
return None