Présentation du module Django-Polymorphic
Django-Polymorphic étend les capacités d'héritage de modèles dans Django en permettant le downcasting automatique. Cette bibliothèque simpilfie la gestion des hiérarchies complexes d'objets.
Exemple de structure de modèles
from django.db import models
from polymorphic.models import PolymorphicModel
class Projet(PolymorphicModel):
nom = models.CharField(max_length=50)
class ProjetArt(Projet):
technique = models.CharField(max_length=30)
class ProjetScientifique(ProjetArt):
domaine = models.CharField(max_length=40)
Filtres polymorphes
# Obtenir toutes les instances de ProjetArt et sous-classes
Projet.objects.instance_of(ProjetArt)
# Filtres combinés avec Q
from django.db.models import Q
Projet.objects.filter(Q(instance_of=ProjetArt))
Filtres transversaux
Recherche à travers l'arbre d'héritage avec la syntaxe "Classe___champ":
Projet.objects.filter(
Q(ProjetArt___technique='Huile') |
Q(ProjetScientifique___domaine='Biologie')
)
Combinaison de QuerySets
resultats = (Projet.objects.instance_of(ProjetArt) |
Projet.objects.instance_of(ProjetScientifique))
Relasions polymorphes
Relation Many-to-Many
class Participant(models.Model):
projets = models.ManyToManyField(Projet)
p = Participant.objects.create()
p.projets.add(Projet.objects.first())
p.projets.add(ProjetArt.objects.first())
p.projets.all() # Retourne les objets avec leur type réel
Duplication d'objets
original = ProjetArt.objects.first()
nouveau = original
nouveau.pk = None
nouveau.id = None
nouveau.nom = "Copie"
nouveau.save()
Intégration de modèles tiers
from external import ExternalModel
class ModeleBase(PolymorphicModel, ExternalModel):
champ_local = models.CharField(max_length=20)
class ModeleSpecialise(ModeleBase):
details = models.TextField()
Désactivation du polymorphisme
# Requête non polymorphe
queryset = Projet.objects.non_polymorphic().all()
# Conversion en instances réelles
Projet.objects.get_real_instances(queryset)
Amélioration de l'affichage
from polymorphic.showfields import ShowFieldType
class Projet(ShowFieldType, PolymorphicModel):
nom = models.CharField(max_length=50)
polymorphic_showfield_max_field_width = 25
Considérations techniques
1. Impact potentiel sur les performances avec des hiérarchies complexse
2. Certaines méthodes QuerySet comme values_list() ne sont pas supportées
3. Éviter les structures d'héritage en diamant