Переупорядочение полей в модели Django

Я хочу добавить немного полей к каждой модели в моем django приложении. На этот раз это created_at, updated_at и notes. Дублирование кода для каждого из 20 + модели кажется немым. Так, я решил использовать абстрактный базовый класс, который добавит эти поля. Проблема состоит в том, что поля, наследованные от абстрактного базового класса, на первом месте в cписке полей в администраторе. Объявление полевого порядка на каждый класс 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 ... 

Это работает, как предназначено, но я задаюсь вопросом, там лучший способ достигнуть моей цели?

9
задан Alexander Lebedev 3 May 2010 в 19:43
поделиться

1 ответ

Если вам в основном нужен порядок для администратора Django, вы также можете создать свой «общий» класс -admin через подкласс админского класса Django. См. http://docs.djangoproject.com/en/dev/intro/tutorial02/#customize-the-admin-form для настройки отображения полей в админке. Вы могли перезапишите __ init __ администратора, чтобы настроить поля / наборы полей при создании экземпляра администратора по своему усмотрению. Например. вы можете сделать что-то вроде:

class MyAdmin(admin.ModelAdmin):
    def __init__(self, model, admin_site):
        general_fields = ['notes', 'created_at', 'updated_at']
        fields = [f.name for f in self.model._meta.fields if f.name not in general_fields]
        self.fields = fields + general_fields
        super(admin.ModelAdmin, self).__init__(model, admin_site)

Кроме того, я думаю, что не рекомендуется изменять (частный) _field_name_cache !

5
ответ дан 4 December 2019 в 15:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: