首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python2 -> 3 Django迁移导致字段参数类型更改

问Python2 -> 3 Django迁移导致字段参数类型更改
EN

Stack Overflow用户
提问于 2018-08-28 12:11:31
回答 1查看 2K关注 0票数 15

我们正在从Django 1.8 -> 2.1和Python2.7 -> 3.6中转换一个Django项目。

在旧的项目版本中,有如下所示的Django模型:

代码语言:javascript
复制
# 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。

代码语言:javascript
复制
# 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是一个字符串文本。

代码语言:javascript
复制
# 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导致直接的问题,我们就可以返回到它,但我更关心的是引入的更微妙的问题,直到很久以后才会被捕捉到。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-28 12:30:14

在提出这个问题后,我遇到了一个Django票,Django开发人员的建议是编辑包含(Python3)字节字面值的任何遗留迁移文件(如0001_initial),删除b并在Python3中使它们成为字符串文本。

编辑迁移以解决此问题是安全的。

从这里开始,您应该能够删除使用python3 ./manage.py makemigrations创建的迁移模块,并重新执行该命令,该命令将不再对该参数的类型产生问题。

我使用以下方法用'db_column='对所有'db_column=b'实例进行了大量查找和替换。当然,在提交之前,您应该绝对检查git diff。

代码语言:javascript
复制
grep -nrl "db_column=b" apps | xargs sed -i "s/db_column=b/db_column=/g"
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52057583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档