xadmin django里面如何更改model里面field名称, 但是不丢失数据

Q: django里面如何更改model里面field名称, 但是不丢失数据

A:

执行python manage.py makemigrations之后, 打开迁移文件, 找到相关字段部分. 改为

migrations.RenameField(
            model_name='case',
            old_name='update_user',
            new_name='create_user',
        ),

如果除了field名称之外,还有其他修改的话, 比如verbose_name或者max_length修改. 那么先忽略这些修改. 这个迁移文件里只保留rename行为. 然后再执行一次python manage.py makemigrations 会再生成一个文件.在里面有AlterField.

之后执行python manage.py migrate即可.

举例:

原先model里只有update_user

 update_user = models.CharField(max_length=100, verbose_name="修改人", null=True)

现在需要改成

 create_user = models.CharField(max_length=100, verbose_name="创建人", null=True)
    update_user = models.CharField(max_length=100, verbose_name="修改人", null=True)

但是需要将原来update_user的数据, 导入到现在create_user当中. 也就是我们的逻辑不是加了一个字段create_user. 而是, 先把update_user rename成create_user, 然后再增加字段update_user

方法先python manage.py makemigrations. 生成的apps/thehive/migrations/0021_auto_20190725_1921.py文件里面内容是

migrations.AddField(
            model_name='case',
            name='create_user',
            field=models.CharField(max_length=100, null=True, verbose_name='创建人'),
        ),
 migrations.AlterField(
            model_name='case',
            name='update_user',
            field=models.CharField(max_length=100, null=True, verbose_name='修改人'),
        ),

也就是默认行为加字段create_user, 改字段update_userverbose_name.

我们需要改成rename操作.

 migrations.RenameField(
            model_name='case',
            old_name='update_user',
            new_name='create_user',

        ),

改完之后再执行python manage.py makemigrations这样, 就增加了create_user更改verbose_name的行为 和增加新列update_user的行为

apps/thehive/migrations/0022_auto_20190725_1925.py

migrations.AddField(
    model_name='case',
    name='update_user',
    field=models.CharField(max_length=100, null=True, verbose_name='修改人'),
),
migrations.AlterField(
    model_name='case',
    name='create_user',
    field=models.CharField(max_length=100, null=True, verbose_name='创建人'),
),

之后执行python manage.py migrate之后如图. 原来修改人的数据都移动到了创建人里面,新增了修改人字段

原先的保存逻辑修改为

    def save_models(self):
        # 每个model proxy保存的时候讲report_type设置成对应的类型
        obj = self.new_obj
        if not obj.create_user:
            obj.create_user = self.user.username
        obj.update_user = self.user.username
        obj.report_type = "报告A"
        obj.save()

###