Il est possible d’écraser le manager par défaut en re-définissant la propriété objects
du modèle.
Créer un manager personnalisé: une classe héritant de django.db.models.Manager
class DicomEntityManager(models.Manager):
def create_from_header(self, header) -> tuple:
"""
Get or create an instance using the provided header.
:param DicomHeader header - Header instance to query this entity's information from
:return Tuple[DicomEntity, bool] - dicom_entity, created
"""
uid = header.get_entity_uid(self.model)
try:
existing = self.get(
uid=uid,
namespace_id=header.namespace_id,
)
except ObjectDoesNotExist:
new_instance = self.model()
new_instance.namespace_id = header.namespace_id
new_instance.save(header=header)
return new_instance, True
else:
return existing, False
Déclarer le manager du modèle dans la propriété objects
du modèle:
class DicomEntity(models.Model):
# ...
objects = DicomEntityManager()
class Meta:
base_manager_name = 'objects'
Récupérer le manager de la classe à partir de la propriété objects
instance = DicomEntity.objects.create_from_header(header)
On peut également ajouter des fonctions au queryset du manager, en créant la classe Manager à partir d’un QuerySet:
Créer un queryset personnalisé: une classe héritant de django.db.models.QuerySet
from django.db import models
class AIDecisionQuerySet(models.QuerySet):
association_lookup_name = None
def select_send_related(self):
qs = self
return (
qs.select_related(
'patient',
'studyradiological',
'studyradiological__nodule_data1',
'studyradiological__nodule_data2',
).only(
'id',
'created_at',
'updated_at',
'status',
'is_enabled',
'patient_id',
'patient__gender',
'studyradiological',
'dicom_study_uid',
'dicom_series_uid',
)
)
Créer un manager à partir de ce queryset
class AIDecisionManager(models.Manager.from_queryset(AIDecisionQuerySet)):
use_in_migrations = True
Déclarer le manager de la classe
class AIDecision(
AIDecisionStatusChoicesMixin,
models.Model,
):
# ...
objects = AIDecisionManager()
class Meta:
base_manager_name = 'objects'
Utiliser une méthode du queryset personnalisé, de la même manière que si c’était une méthode du queryset natif
qs = AIDecision.objects.all().select_send_related()