django - 从标准 Django 模型中删除字段

标签 django model del

注意:此问题之前已被问过 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/

相关文章:

python - 将模型与应用程序的其余部分分开是一种好的编程习惯吗

json - 已经将字段更改为字符串,但仍然出现错误

Python - 从函数内部删除(从内存中删除)变量?

ruby-on-rails - ruby /rails : create a class method that operates on instances of its children?

javascript - 使用 Django 和 Javascript 验证表单字段时出现 ValueError

python - 在 PyCharm 中运行 Django 测试

python - 如何在django中读取python中的日志文件

python - 是否可以删除一个类的实例,该类的实例会自动将其从作为元素的所有列表中删除?

python - 删除实例时删除属性

django - 将文件从 Docker 容器上传到 Google Cloud Storage