Django使用django-address数据迁移时分配地址报Invalid address value错误
问题根本原因
django-address的AddressField字段在校验赋值时会检查传入值是否为address模块下的真实Address模型实例,而你在迁移文件中通过apps.get_model获取的Address是Django生成的历史版本模型类,和字段校验依赖的真实类不是同一个类实例,isinstance校验失败,因此抛出「Invalid address value」错误。
解决方案
方案1(推荐,无兼容风险)
直接通过外键底层字段address_id赋值,跳过字段的类型校验逻辑,无需修改现有模型和其他依赖:
from django.db import migrations def forward_data_migration(apps, schema_editor): Address = apps.get_model("address", "Address") Locality = apps.get_model("address", "Locality") Property = apps.get_model("myApp", "Property") db_alias = schema_editor.connection.alias Locality.objects.using(db_alias).bulk_create([ Locality(name="Foo",) ]) Address.objects.using(db_alias).bulk_create([ Address(raw="1 Fake street", locality=Locality.objects.using(db_alias).get(name="Foo"), ), ]) # 直接获取地址ID赋值给底层外键字段,绕过校验 target_address = Address.objects.using(db_alias).get(raw="1 Fake street") Property.objects.using(db_alias).bulk_create([ Property(building_name="Test building", address_id=target_address.id), ])
方案2(适用模型结构稳定场景)
直接导入真实的模型类替代迁移上下文的历史模型,满足字段校验要求:
from django.db import migrations # 直接导入真实模型 from address.models import Address, Locality from myApp.models import Property def forward_data_migration(apps, schema_editor): db_alias = schema_editor.connection.alias Locality.objects.using(db_alias).bulk_create([ Locality(name="Foo",) ]) Address.objects.using(db_alias).bulk_create([ Address(raw="1 Fake street", locality=Locality.objects.using(db_alias).get(name="Foo"), ), ]) Property.objects.using(db_alias).bulk_create([ Property(building_name="Test building", address=Address.objects.using(db_alias).get(raw="1 Fake street")), ])
注意:该方案仅适用于本次迁移执行时,导入的真实模型结构和数据库中对应表结构完全一致的场景,避免出现迁移不一致问题。
内容的提问来源于stack exchange,提问作者Camilo
相关产品推荐
相关产品推荐

