Я хочу добавить несколько полей для каждой модели в моем приложении django. На этот раз это created_at
, updated_at
и notes
. Дублирование кода для каждой из 20+ моделей кажется глупым. Итак, я решил использовать абстрактный базовый класс, который бы добавил эти поля. Проблема в том, что поля, унаследованные от абстрактного базового класса, стоят первыми в списке полей в admin. Объявление порядка полей для каждого класса ModelAdmin не вариант, это даже более дублирующий код, чем при ручном объявлении поля.
В моем окончательном решении я изменил конструктор модели, чтобы изменить порядок полей в _meta перед созданием нового экземпляра:
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 ...
Работает как задумано, но мне интересно, есть ли лучший способ достичь моей цели?