在SQLite3中更改属性字段类型

时间:2019-03-06 21:49:53

标签: django python-2.7 django-models sqlite

我正在尝试通过执行空迁移将属性之一的字段类型从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的新属性。

1 个答案:

答案 0 :(得分:1)

all_ks.objects.get_or_create()返回一个All_ks对象,您将其分配给DecimalField LastPrice_v1。因此,显然Django抱怨。为什么不分配相同的ks的{​​{1}}?

LastPrice

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

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

所有步骤都是Django原始操作,您可以将其还原到最后一步(很高兴有如您刚刚经历的那样意外发生转弯)。