django - 使用南转换外键转换为ManyToManyField不工作

标签 django django-models foreign-keys many-to-many django-south

我正在使用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/

相关文章:

python - django - 如何在模板中插入上传文件的内容?

django - 如何为模板制作可重用的 Django 页面导航解决方案

django - Django 的 Views.py 中选择选项的值

python - 具有预定义内联的 django 管理表单

python - 在模板中显示相关对象的数据 - Django

python - Django 上传文件

python - Django背景图片消失

Django Rest Framework - 过滤 ArrayField 包含 value1 或 value2 而不是子集的模型

Grails 多对一关系删除

mysql - 如何限制一个表的主键应该引用另一个表的外键的确切数量