Django模型对象可为未定义字段赋值且保存不报错?原因咨询
为什么给Django模型实例添加未定义属性后save()不报错?
这个问题其实涉及两个核心点:Python的动态语言特性,以及Django ORM的工作逻辑,咱们拆解开来聊:
Python允许动态给对象添加属性
Python作为动态类型语言,天生支持在运行时给任意对象新增实例属性——不管这个属性有没有在类定义里提前声明。所以你执行s.i_dont_know = 1这一步,只是给这个Symbol实例对象额外挂了个“私有”属性,属于Python语言本身允许的操作,完全不会触发错误。Django的save()只处理模型定义的字段
当你调用s.save()时,Django的ORM只会聚焦你在Symbol类里用models.Field系列类型定义的字段(也就是你的market字段)。它会收集这些字段的当前值,生成对应的INSERT/UPDATE SQL语句去操作数据库。你动态添加的
i_dont_know这类属性,不在Django模型的字段注册表中,ORM根本不会去扫描或处理它们,自然不会尝试把这些属性写到数据库里,也就不会产生任何数据库层面的错误,Django本身也不会对这些“额外属性”做校验。
简单总结:你给实例加的属性是Python对象层面的“额外数据”,Django的save()只负责同步模型定义好的数据库字段,两者互不干扰,所以不会报错。
内容的提问来源于stack exchange,提问作者user3595632
相关产品推荐
相关产品推荐

