【问题标题】:Change attribute field type in SQLite3更改 SQLite3 中的属性字段类型
【发布时间】:2019-07-28 16:27:55
【问题描述】:

我正在尝试通过执行空迁移将属性之一的字段类型从 CharField 更改为 DecimalField,并通过使用以下内容填充迁移日志来填充新字段:

from __future__ import unicode_literals

from django.db import migrations
from decimal import Decimal

def populate_new_col(apps, schema_editor):  #Plug data from 'LastPrice' into 'LastPrice_v1' in the same model class 'all_ks'.
    all_ks = apps.get_model('blog', 'all_ks')
    for ks in all_ks.objects.all():
        if float(ks.LastPrice):  #Check if conversion to float type is possible...
            print ks.LastPrice
            ks.LastPrice_v1, created = all_ks.objects.get_or_create(LastPrice_v1=Decimal(float(ks.LastPrice)*1.0))
        else:  #...else insert None.
            ks.LastPrice_v1, created = all_ks.objects.get_or_create(LastPrice_v1=None)
        ks.save()

class Migration(migrations.Migration):

    dependencies = [
        ('blog', '0027_auto_20190301_1600'),
    ]

    operations = [
        migrations.RunPython(populate_new_col),
    ]

但我在尝试迁移时不断收到错误消息:

TypeError: Tried to update field blog.All_ks.LastPrice_v1 with a model instance, <All_ks: All_ks object>. Use a value compatible with DecimalField.

我错过了将字符串转换为十进制的内容吗? 仅供参考,“LastPrice”是 CharField 的旧属性,“LastPrice_v1”是 DecimalField 的新属性。

【问题讨论】:

    标签: django python-2.7 django-models sqlite


    【解决方案1】:

    all_ks.objects.get_or_create() 返回一个您分配给 DecimalField LastPrice_v1All_ks 对象。所以很明显Django会抱怨。为什么不分配相同的ksLastPrice

    ks.LastPrice_v1 = float(ks.LastPrice)
    

    也就是说,摆弄手动迁移对于您想要实现的目标来说似乎很麻烦(除非您非常熟悉迁移代码)。如果你不是,你通常会更好

    • 在代码中创建新字段
    • 正在迁移
    • 填充新字段
    • 重命名旧字段
    • 将新字段重命名为原始名称
    • 删除旧字段
    • 再次迁移

    所有步骤都是普通的 Django 操作,附带的好处是您可以恢复到最后一步(当事情可能发生意想不到的转变时,就像您刚刚经历的那样,这很高兴)。

    【讨论】:

    • 好的,它现在适用于可以转换为浮点数的值,但不知何故,字符串值没有被分配一个空值。我将 else 部分更改为 ks.LastPrice_v1 = None
    • NVM 我得到 ValueError 异常以与 try...except 一起使用。另外我认为填充新字段仅在迁移日志操作中使用 RunPython 进行空迁移时才有效?
    • try/except ValueError 是要走的路,是的。恐怕我无法提供迁移代码;除非您定期重组数据库,否则我相信执行上述任何更改会更简单、更安全。
    猜你喜欢
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 2018-12-16
    • 1970-01-01
    相关资源
    最近更新 更多