【问题标题】:How to reduce max_length of CharField in Django when data already exists in db当数据库中已存在数据时如何减少 Django 中 CharField 的 max_length
【发布时间】:2017-10-17 18:12:36
【问题描述】:

我在 Django (1.9) 模型上有一个 CharField:

alias = models.CharField(max_length=50)

该应用正在使用中并且已经有数据,并且已经有对象使用了全部 50 个字符。当我尝试迁移时,在不收到生产数据库投诉的情况下,减少此字段的 max_length 的最简单方法是什么?如果有区别,DB 就是 postgresql。

【问题讨论】:

  • 您要保留这些文本吗?还是删除它们?
  • 只需更改 models.py 中的定义...这将在设置新值时从 python 端强制执行,但不会更改对 db 的约束...
  • fron django.db.models import F;MyModels.objects.update(alias=F('alias')[:new_length])(我认为!)如果您的问题是这样,将缩短所有现有字段
  • @Exprator 理想情况下只是截断那些太长的,但也可以删除它们。

标签: python django maxlength django-model-field


【解决方案1】:

将 max_length=50 减少到其他 max_length=20

> python manage.py makemigrations
> python manage.py migrate

您保存的所有新数据都将使用新的 max_length

对于存在的数据,你可以制作简单的脚本

from myproject.models import Mymodel

for obj in Mymodel.objects.all():
    obj.Firstname = obj.Firstname[0:3]    
    obj.save()

【讨论】:

    【解决方案2】:

    我认为正确的方法是简单地进入开发 python 终端并访问该特定模型的所有对象并将别名的值截断为:

     for object in MyModel.objects.all():
          object.alias = object.alias[:REDUCED_LENGTH]
          object.save()
    

    并且,更改模型中 CharField 中的 max_length 并运行迁移。

    【讨论】:

      猜你喜欢
      • 2018-11-29
      • 1970-01-01
      • 2020-08-19
      • 2011-09-24
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      相关资源
      最近更新 更多