python – 在现有的Django应用程序中更改主键的最佳方法是什么?

我有一个应用程序是在BETA模式。这个应用程序的模型有一些明确的primary_key类。因此,Django使用字段,不会自动创建id。

class Something(models.Model):
    name = models.CharField(max_length=64, primary_key=True)

我认为这是一个坏主意(见unicode error when saving an object in django admin),我想移回来,为我的模型的每一个类都有一个id。

class Something(models.Model):
    name = models.CharField(max_length=64, db_index=True)

我已经对我的模型进行了更改(将每个primary_key = True替换为db_index = True),并且要使用south迁移数据库。

不幸的是,迁移失败,并显示以下消息:
ValueError:您不能添加没有默认值的null = False列。

我正在评估这个问题的不同解决方法。有什么建议么?

谢谢你的帮助

最佳答案
同意,你的模型可能是错误的。

正式主键应始终是代理键。从来没有别的。 [强言。自从20世纪80年代以来是数据库设计师。重要的经验教训是:一切都是可变的,即使当用户发誓他们的母亲的坟墓,价值不能改变是真正的自然关键,可以作为主要。它不是主要的。只有替代物才是主要的。]

你在做心脏直视手术。不要混乱模式迁移。您正在替换架构。

>将您的数据卸载到JSON文件。使用Django自己的内部django-admin.py工具。您应该为将要更改的每个文件创建一个卸载文件,并且每个表依赖于正在创建的键。单独的文件使这更容易做。
>删除要从旧模式更改的表。

依赖于这些表的表将改变它们的FK;你可以
更新行在原地或 – 它可能更简单 – 删除和重新插入
这些行,也。
>创建新模式。这将只创建正在改变的表。
>编写脚本以使用新键读取和重新加载数据。这些都很短,非常相似。每个脚本将使用json.load()从源文件中读取对象;您将从为您构建的JSON元组线对象创建您的架构对象。然后,可以将它们插入到数据库中。

你有两种情况。

>将插入PK更改更改的表,并获取新的PK。这些必须“级联”到其他表,以确保另一个表的FK也改变。
>具有更改的FK的表必须定位外表中的行并更新其FK引用。

替代。

>重命名所有旧表。
>创建整个新模式。
>编写SQL以将所有数据从旧模式迁移到新模式。这将必须巧妙地重新分配键,因为它去。
>删除重命名的旧表。

转载注明原文:python – 在现有的Django应用程序中更改主键的最佳方法是什么? - 代码日志