Fonctionnalités Avancées de Django-Polymorphic

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

Étiquettes: Django polymorphic modèle Héritage requête

Publié le 11 août à 03h53