Удалить поле из стандартной модели Django - PullRequest
3 голосов
/ 24 ноября 2011

ПРИМЕЧАНИЕ : это было задано до того, как AbstractUser существовало, что, вероятно, вы хотели бы использовать в наши дни.

В основном я хотел бы удалить поле электронной почты по умолчанию из класса пользователя Django по умолчанию ...

class MyUser(User):
    field = models.CharField(max_length = 10)
    a = 'hello'
    def b(self):
        print 'world'

del User.email
del MyUser.email
del Myuser.field

Все это дает AttributeError. Удаление методов или атрибутов выполняется следующим образом, хотя работает нормально:

del MyUser.a
del MyUser.b

Так что мне любопытно, почему это не работает; К какому типу относятся эти модельные поля?

Еще одна вещь, которую я попробовал, это перезаписать электронную почту, создав электронную почту = Нет в MyUser, но это тоже не сработало (и было бы немного уродливее).

Заранее спасибо!

P.s. Если вам интересно, почему; это скорее для любопытства, чем для приложения ... Но я думаю, что хорошо не иметь неиспользуемые столбцы в базе данных. P.p.s. Я не хочу изменять файлы Django, чтобы вручную удалить «электронную почту» из пользователя.

РЕДАКТИРОВАТЬ: Дополнительный вопрос здесь (для тех, кто хочет сделать то же самое) Перед syncdb, удалить поле из стандартной модели Django

1 Ответ

7 голосов
/ 24 ноября 2011

Как вы обнаружили, поля модели на самом деле не являются атрибутами класса, даже если они кажутся.

Модели создаются с помощью очень умных, но сложных хакерских метаклассов. Когда выполняется определение класса модели (в первый раз импортируется его models.py), метакласс выполняет все определения полей для этой модели и вызывает метод contribute_to_class каждого из них. В результате фактические поля помещаются в свойство _meta.fields нового класса. Таким образом, сам класс модели не имеет полей в качестве прямых свойств.

Затем, когда экземпляр модели фактически создается, Django берет этот список и напрямую устанавливает атрибуты нового экземпляра, используя либо аргументы конструктора, либо значения по умолчанию, предоставленные полями. Таким образом, значение, к которому осуществляется доступ через экземпляр, не имеет фактического кода поля: это простой атрибут экземпляра.

В любом случае, результатом всего этого является то, что для удаления поля из определения модели вам просто нужно удалить его из списка Model._meta.fields.

...