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





all_ks.objects.get_or_create() возвращает объект All_ks, который вы назначаете DecimalField LastPrice_v1. Так что, очевидно, Джанго жалуется. Почему бы вам не назначить те же самые ks's LastPrice?
ks.LastPrice_v1 = float(ks.LastPrice)
Тем не менее, возиться с ручной миграцией кажется большой проблемой для того, чего вы хотите достичь (если вы не очень хорошо знакомы с кодом миграции). Если нет, то обычно лучше
Все шаги являются обычными операциями Django с бонусом, который вы можете отменить до самого последнего шага (приятно иметь, когда все может принять неожиданный оборот, как вы только что испытали).
NVM я получаю исключение ValueError для работы с попыткой... кроме . Также я думал, что заполнение нового поля работает только при выполнении пустой миграции с помощью RunPython в операциях журнала миграции?
try/except ValueError это путь, да. Боюсь, я не могу помочь с кодом миграции; если вы не реструктурируете базы данных на регулярной основе, я считаю, что проще и безопаснее выполнять любые изменения, как описано выше.
Хорошо, теперь это работает для значений, которые можно преобразовать в числа с плавающей запятой, но каким-то образом строковым значениям не было присвоено нулевое значение. У меня другая часть изменена на ks.LastPrice_v1 = None