Django ArrayField设置default=list()仍报E003警告破坏fixture怎么办?
核心原因
你误解了警告提示的要求,当前你写的default=list()并不是Django要求的可调用对象(callable),而是已经执行构造函数生成的空列表实例,和default=[]本质完全一致,因此仍然会触发E003规则的警告。
修复方法
将两个ArrayField字段的默认值参数改为不带括号的list,直接传入可调用的列表构造函数本身即可:
class Action(models.Model): d_changes = ArrayField(models.FloatField(), default=list, verbose_name='D Changes') w_changes = ArrayField(models.FloatField(), default=list, verbose_name='A Changes')
修改完成后生成并应用新的迁移文件,后续生成迁移、导出fixture时都不会再触发该警告,导出的JSON文件不会被警告内容污染,loaddata命令可以直接正常执行。
补充说明
Django要求可变类型字段的默认值传入可调用对象的逻辑,和Python函数不要使用可变对象作为参数默认值的规则一致:如果直接传入list()或者[],这个默认的空列表会在模块加载时就被创建,所有模型实例共用同一个列表对象,会出现修改一个实例的默认值导致所有实例的默认值都被修改的异常问题。传入list(构造函数本身)时,Django每次需要为新实例生成默认值时都会单独调用一次构造函数,每次生成独立的空列表,避免了共用对象的问题。
内容的提问来源于stack exchange,提问作者NakedPython
相关产品推荐
相关产品推荐

