【问题标题】:Django Migrations: Modifying Field of Model After Database in UseDjango Migrations:在使用数据库后修改模型的字段
【发布时间】:2019-06-23 22:21:52
【问题描述】:

我创建了一个 Django Web 应用程序,其中包含模型和创建的许多模型实例。问题是我想将另一个字段添加到已经在使用的模型之一(有超过 1000 个实例)。过去我在使用 Django Migrations 时遇到过困难的经历,并且担心如果我通过添加字段来修改模型,我的 Web 应用程序将无法运行。

如何更改模型以使其不会影响我的 Web 应用程序的功能?

【问题讨论】:

  • 您能解释一下您要添加哪个模型字段吗?
  • 我要添加一个字符串字段。
  • 使用默认空字符串添加此字段,如果此字段不是唯一的,那么它对您来说是安全的。
  • 该字段将是唯一的,因为它将是模型的替代 ID
  • 您仍然需要 a) 将字段添加为具有默认值的非唯一字段,然后 b) 迁移,c) 使用唯一值填充它,d) 在模型中将其设置为唯一,然后 e)再次迁移。只要您的应用程序不使用该字段,它的存在就不太可能破坏应用程序。

标签: django postgresql django-migrations


【解决方案1】:

以下内容应该可以解决您的问题而不会引入任何问题。

如果需要,您可以通过检查 django admin 中的字段来检查数据是否已正确填充。

但是,我建议您为自己设置一个开发环境,这样您就可以测试这种东西,而不必担心它是否会导致您的生产环境出现问题。

我希望这会有所帮助!


首字母:

Models.py

class ExampleModel(models.Model):
    name = models.CharField(blank=True, null=True)

第一个变化:

Models.py

class ExampleModel(models.Model):
    name = models.CharField(blank=True, null=True)
    unique_str = models.CharField(blank=True, null=True) # add this here

运行:

python manage.py makemigrations
python manage.py migrate

然后你可以运行一个脚本来填充你的 unique_str:

# get all model instances
example_models = ExampleModel.objects.all()

# update each unique_str as required
for e in example_models:
    e.unique_str = e.pk # add any required logic here to assign value to this variable
    e.save()

最后:

Models.py

class ExampleModel(models.Model):
    name = models.CharField(blank=True, null=True)
    unique_str = models.CharField(blank=True, null=True, unique=True) # add unique

然后再次运行:

python manage.py makemigrations
python manage.py migrate

【讨论】:

    猜你喜欢
    • 2013-12-26
    • 1970-01-01
    • 2015-12-11
    • 2020-07-23
    • 2018-11-25
    • 2021-10-14
    • 1970-01-01
    • 2015-06-29
    相关资源
    最近更新 更多