自定义南迁移与自定义字段 - Django

时间:2011-08-17 08:39:47

标签: database django postgresql django-south

我是Django的新手,刚刚找到了一份工作,涉及到我没有设计的网站维护和添加功能,所以我仍然对结构和项目的内容感到困惑。该站点正在使用South进行数据库迁移,我已经习惯使用它来为项目添加新的应用程序。我现在遇到的麻烦是我需要删除模型中的某个字段,因为它不再需要,并且在管理页面上需要填写它。从我对Django到目前为止的理解来看,它似乎是一个自定义领域。它在它自己独立的库应用程序中定义如下(仍然不确定这是否是正确的术语)。

class Genre(models.Model):
    name = models.CharField(max_length=255)
    def __unicode__(self):
        return u"%s" % self.name

以下是使用自定义字段的模型,如果有帮助的话。

class Entry(models.Model):
    artist = d51fields.ForeignKey(Artist, instantiate_fn=instant_artist)
    album = d51fields.ForeignKey(Album, js_methods=['match_artist_and_startswith'], instantiate_fn=instant_album)
    track = d51fields.ForeignKey(Track, js_methods=['match_album_and_startswith'], instantiate_fn=instant_track)
    genre = models.ForeignKey(Genre)
    submitted = models.DateTimeField(auto_now_add=True)
    is_rotation = models.BooleanField()
    dj = models.ForeignKey(DJ)
    show = models.ForeignKey(Show, null=True, blank=True)
    objects = EntryManager()
    def __unicode__(self):
        return "%s [%s]" % (self.artist, self.track)
    class Meta:
        verbose_name = "entry"
        verbose_name_plural = "entries"

我查看了迁移自定义字段的文档,但这对我来说真的很混乱,所以我正在寻找更多帮助。我只是想摆脱持有Genre字段的表并使用与之关联的外键清理依赖项。你认为我应该为South编写一些自定义规则并使用迁移,或者只是尝试在Postgresql中手动执行。我试着用Postgres做这件事,但我失败了。

非常感谢任何指导。如果您想了解有关情况的更多信息,请询问,我可以将其添加到帖子中。我有一种感觉,我将不得不处理很多依赖,但希望有一个简单的解决方法。

此外,如果有人知道如何很好地了解数据库结构,那就很好。

非常感谢。你们所有人都很棒。

EDIT1

这是我删除ForeignKeys然后运行

时得到的
manage.py schemamigration logs --auto

 ! Cannot freeze field 'logs.entry.artist'
 ! (this field has class d51_admin_autofk.fields.ForeignKey)
 ! Cannot freeze field 'logs.entry.album'
 ! (this field has class d51_admin_autofk.fields.ForeignKey)
 ! Cannot freeze field 'logs.entry.track'
 ! (this field has class d51_admin_autofk.fields.ForeignKey)

 ! South cannot introspect some fields; this is probably because they are custom
 ! fields. If they worked in 0.6 or below, this is because we have removed the
 ! models parser (it often broke things).

我不完全确定我接下来应采取什么样的行动。我查看了南方文档,关于如何编写迁移这类内容的规则并不太清楚。

1 个答案:

答案 0 :(得分:1)

我发布的代码中没有任何自定义字段。我看到的只有两个模型,都包含Django附带的标准字段。

如果我理解正确,您可以删除对ForeignKey模型的所有Genre引用。然后运行./manage.py schemamigration <yourappname> --auto。这将要求您提供genre模型中Entry字段的默认值,并提供某种ID。 (这是因为迁移既可以向前也可以向后应用,因此如果您尝试撤消迁移,这将是将在所有模型实例中插入的值。)

最后,只需应用迁移即可实现:./manage.py migrate <yourappname>

之后,您可以安全地删除存储Genre模型的表格。

请确保在开发服务器上尝试此操作,只是为了确保它不会爆炸。 ( - ;