我需要将模型字段的关系从ForeignKey更改为ManyToManyField。伴随数据迁移,以更新先前存在的数据。
以下是原始模型(models.py):
class DealBase(models.Model):
[...]
categoria = models.ForeignKey('Categoria')
[...]
)
我需要模型字段'categoria'与应用程序'deal'中的模型'Categoria'建立多对多关系。
我做了什么:
在DealBase中创建新字段'categoria_tmp'
class DealBase(models.Model):
categoria = models.ForeignKey('Categoria')
categoria_tmp = models.ManyToManyField('Categoria',related_name='categoria-temp')
进行模式迁移
python manage.py makemigrations
编辑migrationfile.py以将数据从categoria迁移到categoria-tmp
def copy_deal_to_dealtmp(apps, schema_editor):
DealBase = apps.get_model('deal', 'DealBase')
for deal in DealBase.objects.all():
deal.categoria_tmp.add(deal.categoria)
deal.save()
class Migration(migrations.Migration):
dependencies = [
('deal', '0017_dealbase_indirizzo'),
]
operations = [
migrations.AddField(
model_name='dealbase',
name='categoria_tmp',
field=models.ManyToManyField(related_name='categoria-temp', to='deal.Categoria'),
preserve_default=True,
),
migrations.RunPython(
copy_deal_to_dealtmp
)
]
进行数据迁移
python manage.py migration
最后,我需要删除列'dealbase.categoria'并将列'dealbase.categoria-tmp'重命名为'dealbase.categoria'
我被困在步骤5。
有人可以帮我吗?我无法在线找到答案,我正在使用Django 1.8。
谢谢!
您只需要创建两个其他迁移:一个删除旧字段,另一个修改新字段。
首先删除dealbase.categoria并创建迁移,然后将dealbase.categoria-tmp重命名为dealbase.categoria并创建另一个迁移。
这将删除第一个字段,然后将tmp字段更改为正确的名称。
尝试一下,可能会帮助您。
第1步,属于您
python manage.py makemigrations && python manage.py migrate
打开shell
for i in DealBase.objects.all()
i.categoria_tmp.add(i.categoria)
删除您的字段categoria
python manage.py makemigrations && python manage.py migrate
添加字段
categoria = models.ManyToManyField('Categoria',related_name='categoria-temp')
然后
python manage.py makemigrations && python manage.py migrate
打开shell
for i in DealBase.objects.all():
for j in i.categoria_tmp.all():
i.categoria.add(j)
删除字段categoria_tmp
python manage.py makemigrations && python manage.py migrate
如果您在此模型中没有任何数据,只需对该模型进行注释,然后运行manage.py makemigrations并进行迁移,然后删除错误的字段并删除注释代码,并进行“ makemigrations”和“ migrate” 。这也适用于Django 2。