Изменить тип поля атрибута в SQLite3 - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь изменить тип поля одного из атрибутов с 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 Ответ

1 голос
/ 07 марта 2019

all_ks.objects.get_or_create() возвращает объект All_ks, который вы назначаете для DecimalField LastPrice_v1.Очевидно, что Джанго жалуется.Почему бы вам не назначить одинаковые ks LastPrice?

ks.LastPrice_v1 = float(ks.LastPrice)

Тем не менее, возиться с ручными миграциями кажется большой проблемой для того, чего вы хотите достичь (если вы неочень знаком с миграционным кодом).Если это не так, вам обычно лучше

  • создать новое поле в коде
  • мигрировать
  • заполнить новое поле
  • переименование старого поля
  • переименование нового поля в исходное имя
  • удаление старого поля
  • повторная миграция

Все шаги ванильные Djangoоперации, с бонусом, который вы можете вернуть до самого последнего шага (приятно иметь, когда вещи могут принять неожиданные повороты, как вы только что испытали).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...