在 Joey 的回答之上添加 Django 2.2.11 的详细步骤。
这是我的用例中的模型,由 Company 和 Employee 模型组成。我们必须将designation 转换为外键字段。应用名称叫core
class Company(CommonFields):
name = models.CharField(max_length=255, blank=True, null=True
class Employee(CommonFields):
company = models.ForeignKey("Company", on_delete=models.CASCADE, blank=True, null=True)
designation = models.CharField(max_length=100, blank=True, null=True)
第 1 步
在Employee中创建外键designation_link并将其标记为null=True
class Designation(CommonFields):
name = models.CharField(max_length=255)
company = models.ForeignKey("Company", on_delete=models.CASCADE, blank=True, null=True)
class Employee(CommonFields):
company = models.ForeignKey("Company", on_delete=models.CASCADE, blank=True, null=True)
designation = models.CharField(max_length=100, blank=True, null=True)
designation_link = models.ForeignKey("Designation", on_delete=models.CASCADE, blank=True, null=True)
第 2 步
创建空迁移。使用命令:
python app_code/manage.py makemigrations --empty --name transfer_designations core
这将在migrations 目录中创建以下文件。
# Generated by Django 2.2.11 on 2020-04-02 05:56
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('core', '0006_auto_20200402_1119'),
]
operations = [
]
第 3 步
使用循环所有Employees 的函数填充空迁移,创建Designation 并将其链接到Employee。
在我的用例中,每个Designation 还链接到Company。这意味着Designation 可能包含两行“经理”,一行用于公司 A,另一行用于公司 B。
最终迁移将如下所示:
# core/migrations/0007_transfer_designations.py
# Generated by Django 2.2.11 on 2020-04-02 05:56
from django.db import migrations
def link_designation(apps, schema_editor):
Employee = apps.get_model('core', 'Employee')
Designation = apps.get_model('core', 'Designation')
for emp in Employee.objects.all():
if(emp.designation is not None and emp.company is not None):
desig, created = Designation.objects.get_or_create(name=emp.designation, company=emp.company)
emp.designation_link = desig
emp.save()
class Migration(migrations.Migration):
dependencies = [
('core', '0006_auto_20200402_1119'),
]
operations = [
migrations.RunPython(link_designation),
]
第 4 步
最后使用以下命令运行此迁移:
python app_code/manage.py migrate core 0007