You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:36:04