我正在使用South将Django中的一种模型中的ForeignKey更改为ManyToManyField,但是没有按预期工作。
# Original Schema
class Item(models.Model):
category = models.ForeignKey(Category, default=default_category)
更改为
# Original Schema
class Item(models.Model):
category = models.ManyToManyField(Category, default=default_category)
因此,在注释掉模型中的ForeignKey行之后,
python manage.py schemamigration affected_model --auto
? The field 'Item.category' does not have a default specified, yet is NOT NULL.
? Since you are removing this field, you MUST specify a default
? value to use for existing rows. Would you like to:
? 1. Quit now, and add a default to the field in models.py
? 2. Specify a one-off value to use for existing columns now
? 3. Disable the backwards migration by raising an exception.
? Please select a choice:
我对此感到困惑,因为1.我已指定一个默认值“default_category”和2.我没有删除任何字段,我只是将其更改为ManyToManyField。我的问题是在这种情况下该如何进行?还有其他技巧可以使用South进行此转换吗?
顺便说一句我正在使用South 0.7和Django 1.1.1
谢谢您的帮助。
最佳答案
实际上,您正在删除该字段。外键由数据库中的一列表示,在这种情况下,该列将命名为category_id。 ManyToMany关系由“通过”表表示。使用django,您可以指定通过表,也可以自动为您生成一个。
这是一次非常重要的迁移,您将需要对其进行手工编码。它将需要一点了解模型的基础数据库表示形式。
您将需要进行3次迁移才能完全做到这一点。首先创建一个具有虚拟多体关系的schemamigration,以保存您的数据。
然后创建一个数据迁移,以将外键关系复制到您的虚拟mantomany
最后,创建schemamigration以删除外键并重命名虚拟manytomany表。
第2步和第3步都将要求您手动编写迁移。我应该强调,这是一种非常重要的迁移方式。但是,这完全是可行的,您只需要真正理解这些关系对数据库意味着什么,而不是平均迁移即可。如果数据很少或没有数据,那么只需删除表并重新开始迁移就容易得多。
关于django - 使用南转换外键转换为ManyToManyField不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6509720/