我需要将模型字段的关系从ForeignKey更改为ManyToManyField。这带有数据迁移,用于更新预先存在的数据。
以下是原始模型( models.py ):
class DealBase(models.Model):
[...]
categoria = models.ForeignKey('Categoria')
[...]
)
我需要模型字段' categoria'与模特'分类'建立多种关系。在app' deal'。
我做了什么:
创建一个新字段' categoria_tmp'在DealBase
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 migrate
最后,我需要删除列' dealbase.categoria'并重命名列" dealbase.categoria-tmp'到' dealbase.categoria'
我被困在第5步。
有人可以帮帮我吗?我在网上找不到答案,我使用的是Django 1.8。
谢谢!
答案 0 :(得分:6)
您只需创建两个额外的迁移:一个用于删除旧字段,另一个用于更改新字段。
首先删除dealbase.categoria并创建一个迁移,然后将dealbase.categoria-tmp重命名为dealbase.categoria并创建另一个迁移。
这将删除第一个字段,然后将tmp字段更改为正确的名称。
答案 1 :(得分:0)
试试这个,可以帮到你。
第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
答案 2 :(得分:0)
如果该模型中没有任何数据,只需评论该模型,然后运行nth-value
并进行迁移。然后删除错误的字段并删除注释代码,并分别创建manage.py makemigrations
和makemigrations
。这也适用于Django 2。