Quiero agregar algunos campos a cada modelo en mi aplicación django. Esta vez es created_at
, updated_at
y notes
. Duplicar el código para cada uno de los más de 20 modelos parece tonto. Entonces, decidí usar una clase base abstracta que agregaría estos campos. El problema es que los campos heredados de la clase base abstracta son los primeros en la lista de campos en admin. Declarar el orden de campo para cada clase de ModelAdmin no es una opción, es incluso más código duplicado que con la declaración de campo manual.Reordenando campos en Django modelo
En mi solución final, he modificado constructor de modelo para cambiar el orden de los campos en _meta antes de crear nueva instancia:
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 ...
Se funciona como está previsto, pero me pregunto, ¿existe una mejor manera de acheive mi objetivo ?