在syncdb之前,从标准Django模型中删除字段

时间:2011-12-10 21:29:33

标签: django model del syncdb

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

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

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

提前致谢!

标记

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

其他信息:

  • 1)目前,代码在models.py中,但我认为Where to put Django startup code?有效。
  • 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上执行。它在创建表之前执行

1 个答案:

答案 0 :(得分:0)

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

有几个人指出,south是处理这些问题的方法。