Je souhaite ajouter quelques champs à chaque modèle de mon application django. Cette fois c'est created_at
, updated_at
et notes
. Le code de duplication pour chacun des 20+ modèles semble stupide. J'ai donc décidé d'utiliser une classe de base abstraite qui ajouterait ces champs. Le problème est que les champs hérités de la classe de base abstraite viennent en premier dans la liste des champs dans admin. Déclarer l'ordre des champs pour chaque classe ModelAdmin n'est pas une option, c'est encore plus de code en double qu'avec une déclaration de champ manuelle.Réorganisation des champs dans le modèle Django
Dans ma solution finale, j'ai modifié constructeur modèle pour réorganiser les champs _meta avant de créer une nouvelle instance:
class MyModel(models.Model):
# Service fields
notes = my_fields.NotesField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
last_fields = ("notes", "created_at", "updated_at")
def __init__(self, *args, **kwargs):
new_order = [f.name for f in self._meta.fields]
for field in self.last_fields:
new_order.remove(field)
new_order.append(field)
self._meta._field_name_cache.sort(key=lambda x: new_order.index(x.name))
super(MyModel, self).__init__(*args, **kwargs)
class ModelA(MyModel):
field1 = models.CharField()
field2 = models.CharField()
#etc ...
Il fonctionne comme prévu, mais je me demande, est-il une meilleure façon de acheive mon objectif ?