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_user
的verbose_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()
###