J'utilise Django 2.2.16. Et voici comment je résous ce problème :
from typing import Any
from django.core.exceptions import ObjectDoesNotExist
from django.db import models
from django.db.models.base import ModelBase
from django.db.models.manager import Manager
class SManager(Manager):
def get_if_exist(self, *args: Any, **kwargs: Any):
try:
return self.get(*args, **kwargs)
except ObjectDoesNotExist:
return None
class SModelBase(ModelBase):
def _prepare(cls):
manager = SManager()
manager.auto_created = True
cls.add_to_class("objects", manager)
super()._prepare()
class Meta:
abstract = True
class SModel(models.Model, metaclass=SModelBase):
managers = False
class Meta:
abstract = True
Et après cela, dans tous les modèles, il suffit d'importer :
from custom.models import SModel
class SUser(SModel):
pass
Et dans views
vous pouvez appeler comme ceci :
SUser.objects.get_if_exist(id=1)