1

这是关于从标准 Django 模型中删除字段的后续问题。简而言之:可以从已创建的模型中动态删除字段,在本例中为字段 User.email 。因此,字段电子邮件将从用户中删除,而无需更改用户的代码。例如,请参见下面的代码。

我可以从模型(1)中动态删除一个字段,但这会在服务器启动时发生,并且在它存在时被撤消。由于 syncdb 不需要服务器正在运行,并且通常似乎忽略了删除代码(不知何故),这种方法不会阻止该字段出现在数据库中(2)。

有没有办法从模型中删除该字段(不更改它所在的文件,因为它是一个 Django 模型),以使其不会出现在数据库中的方式?

提前致谢!

标记

编辑:我的问题不是m = models.IntegerField()要从模型文件中删除文本“”并希望从数据库中删除该字段。问题是我正在使用下面的代码从已经在另一个文件中声明的模型中删除一个字段。我不认为每次运行 syncdb 时都使用 South 创建迁移是一种解决方案 (3)。

附加信息:

  • 1)目前,代码在models.py中,但我想将Django启动代码放在哪里?作品。
  • 2)我可以使用自定义查询在 post_syncdb 信号上删除它,但我希望更优雅的东西......或者更准确,更优雅。
  • 3)如果它甚至可以工作,因为显然syncdb仍然看到'删除'字段),所以我认为South会因为它仍然存在。

这是代码(models.py):

class A(models.Model):
    m = models.IntegerField()

for i, f in enumerate(A._meta.fields):
    if f.name == 'm':
        del A._meta.fields[i]
        break

class B(A):
    n = models.IntegerField()

for i, f in enumerate(B._meta.fields):
    if f.name == 'm':
        del B._meta.fields[i]
        break

编辑:我检查(使用打印)并在syncdb上执行删除代码。它在创建表之前执行

4

1 回答 1

0

django 做了很多元类魔法,我猜这个元类负责定义数据库表来支持你的模型。随后仅删除该字段不足以更改生成的表。

正如一些人所指出的,南方是解决这些问题的方法。

于 2011-12-11T09:17:17.097 回答