我们正在从Django 1.8 -> 2.1和Python2.7 -> 3.6中转换一个Django项目。
在旧的项目版本中,有如下所示的Django模型:
# models.py
from django.db import models
class RowStatusModel(models.Model):
active = models.BooleanField(default=True, db_column='is_active')
# ...
class Meta:
abstract = True注意,这个模块中没有使用from __future__ import unicode_literals。这意味着db_column是Python2 str,对应于Python3中的bytes。
# 0001_initial.py
operations = [
# ...
('row_ef', models.BooleanField(default=True, db_column=b'is_active')
# ...
]注意字节-文字b'is_active,我认为它是由Django完成的,目的是为了更显式,但我不确定。
现在,在将大部分代码基转换为2到3并运行makemigrations之后,Python3将字符串文本视为Python2中的unicode类型,从而为从RowStatusModel继承的每一个模型生成一个迁移,其中db_column是一个字符串文本。
# migrations/0023_auto_20180827_1955.py
migrations.AlterField(
# ...
field=models.BooleanField(default=True, db_column='is_active')
), # ...运行./manage.py migrate时,如果有的话,这会对数据库产生什么影响?“更改”纯粹是在Python方面,还是可能产生什么副作用?
数据库引擎是django.db.backends.postgresql。
我知道,我们只需克隆RDS实例,如果migrate导致直接的问题,我们就可以返回到它,但我更关心的是引入的更微妙的问题,直到很久以后才会被捕捉到。
发布于 2018-08-28 12:30:14
在提出这个问题后,我遇到了一个Django票,Django开发人员的建议是编辑包含(Python3)字节字面值的任何遗留迁移文件(如0001_initial),删除b并在Python3中使它们成为字符串文本。
编辑迁移以解决此问题是安全的。
从这里开始,您应该能够删除使用python3 ./manage.py makemigrations创建的迁移模块,并重新执行该命令,该命令将不再对该参数的类型产生问题。
我使用以下方法用'db_column='对所有'db_column=b'实例进行了大量查找和替换。当然,在提交之前,您应该绝对检查git diff。
grep -nrl "db_column=b" apps | xargs sed -i "s/db_column=b/db_column=/g"https://stackoverflow.com/questions/52057583
复制相似问题