Еще вариант написать менеджер, который будет возвращать объект по id или пустую строку
class SilentQuerySet(models.query.QuerySet):
"""
Обычный QuerySet
get возвращает None, если объект не найден, вызывает исключение MultipleRecordReturned если найдено несколько
get_one возвращает None если объект не найден или первый, если найдено несколько
get_loud - вызывает исключение DoesNotExists если объект не найден, вызывает исключение MultipleRecordReturned если найдено несколько
"""
def get(self, *args, **kwargs):
try:
return super(SilentQuerySet, self).get(*args, **kwargs)
except self.model.DoesNotExist:
return None
def get_one(self, *args, **kwargs):
clone = self.filter(*args, **kwargs)[:1]
return clone.get()
def get_loud(self, *args, **kwargs):
return super(SilentQuerySet, self).get(*args, **kwargs)
class SilentManager(models.Manager):
"""
Обычный Manager использующий SilentQuerySet вместо QuerySet
"""
use_for_related_fields = True
def get_query_set(self):
return SilentQuerySet(self.model, using=self._db)
def get_one(self, *args, **kwargs):
return self.get_query_set().get_one(*args, **kwargs)
def get_loud(self, *args, **kwargs):
return self.get_query_set().get_loud(*args, **kwargs)