注意:此问题之前已被问过 AbstractUser已经存在,这可能就是您现在想要使用的。
基本上我想从默认的 Django User 类中删除默认的电子邮件字段...
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 中创建 email = None 来覆盖电子邮件,但这也不起作用(并且会稍微难看)。
提前致谢!
P.s.如果你想知道为什么;这更多的是出于好奇,而不是应用程序真正需要的......但我认为数据库中不要有未使用的列是件好事。 附注我不想更改 Django 文件来手动删除用户的“电子邮件”。
编辑:此处的后续问题(对于那些想做同样事情的人)Before syncdb, delete field from standard Django model
最佳答案
正如您所发现的,模型字段实际上并不是类属性,尽管它们看起来是。
模型是通过一些非常聪明但复杂的元类黑客技术构建的。当执行模型类定义时(第一次导入 models.py),元类会遍历该模型的所有字段定义,并调用每个字段的 contribute_to_class
方法。最终将实际字段放入新类的 _meta.fields
属性中。因此模型类本身没有字段作为直接属性。
然后,当模型实例实际实例化时,Django 会使用该列表并使用构造函数的参数或字段提供的默认值直接设置新实例的属性。因此,通过实例访问的值背后没有实际的字段代码:它是一个简单的实例属性。
无论如何,所有这一切的结果是,要从模型定义中删除字段,您只需将其从 Model._meta.fields
列表中删除即可。
关于django - 从标准 Django 模型中删除字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8249820/