Django未入库模型访问RelatedManager关联对象字段方法
问题原因
Django 模型通过related_name定义的反向关联本质是数据库查询管理器,默认逻辑是根据主模型主键值,查询关联表中外键匹配的记录。未入库的模型实例没有生成主键,框架不会自动追踪内存中临时创建的关联对象,因此直接访问mytravel.sections无法拿到内存中实例化的TravelSection对象。
解决方案
不需要写入数据库,直接手动给反向关联属性赋值为内存中的关联实例列表即可,所有操作都在内存中完成,完全满足数据预处理的需求:
mytravel = Travel( purpose='teaching', amount=1 ) mysection = TravelSection( travel=mytravel, isRoundTrip=True, distance=500, transportation='train' ) # 手动绑定内存中的反向关联,无任何数据库操作 mytravel.sections = [mysection] # 后续可正常访问关联字段 for section in mytravel.sections: print(section.distance) # 输出 500 print(section.transportation) # 输出 train
注意事项
- 不要对未保存的实例调用
mytravel.sections.add(mysection)方法,该方法是为已入库的关联对象设计的,未保存状态下调用会抛出异常 - 如果有多个关联的
TravelSection实例,统一放到列表中赋值给mytravel.sections即可 - 如果后续需要将对象持久化到数据库,需要先保存
Travel实例拿到主键,再保存关联的TravelSection实例,否则会触发外键约束错误,仅做内存预处理时无需关注这一点
内容的提问来源于stack exchange,提问作者user1595929
相关产品推荐
相关产品推荐

