Django : utiliser un model abstrait

Pourquoi utiliser un model abstrait (abstract model) ?

Parfois il peut être utile de définir des champs pour plusieurs models. Étant donné que nous travaillons avec Django nous voulons mutualiser le maximum de code (selon le principe DRY). On se dit alors qu'on peut faire un model parent dont on fera hériter les models enfants.

Le problème de cette solution est que le model parent correspondra à une table de la base de données. Les models enfants ne contiendront pas ces champs, ils contiendront une relation vers cette table parente. L'architecture de la base de données ne correspondra donc pas du tout à ce à quoi nous pensions.

La solution : les models abstraits

Lorsqu'on définit un model abstrait on lui définit des champs comme pour n'importe quel model. Lorsque l'on génèrera la base de donnée, les models hériterant du model abstrait seront générés sous forme de table indépendante. D'ailleurs aucune table ne sera générée pour le model abstrait.

Exemple

Voici un exemple d'utilisation du model abstrait. Le but est de définir un model abstrait BaseModel dont héritera un model Message. Le model Message se verra donc automatiquement attribuer les éléments du model BaseModel.

Le model abstrait :

Voici le code :

class BaseModel(models.Model):
"""
Model de base dont les autres hériteront
"""
created = models.DateTimeField(auto_now_add = True, verbose_name="Date de création")
modified = models.DateTimeField(auto_now = True, verbose_name="Date de modification")

class Meta:
abstract = True
ordering = ("-created", )


class Message(BaseModel):
"""
Les messages sont affichés sur la page principale
"""
message = models.TextField(verbose_name="Message")