TypeError:在Django数据迁移期间,Decimal类型的对象不可JSON序列化
我在模型中添加了一个TypeError:在Django数据迁移期间,Decimal类型的对象不可JSON序列化,django,python-3.x,postgresql,django-migrations,json-serialization,Django,Python 3.x,Postgresql,Django Migrations,Json Serialization,我在模型中添加了一个postgresJsonField,并为其创建了数据迁移 new_column=pg_fields.JSONField(默认值=dict,编码器=DjangoJSONEncoder) 相同的逻辑用于未来数据(在模型的save()中)和历史数据(数据迁移) 这是我试图保存的数据格式 data = { 'premium': obj.amount * obj.persons, } proposal.new_column = data proposal.sav
postgres
JsonField
,并为其创建了数据迁移
new_column=pg_fields.JSONField(默认值=dict,编码器=DjangoJSONEncoder)
相同的逻辑用于未来数据(在模型的save()
中)和历史数据(数据迁移)
这是我试图保存的数据格式
data = {
'premium': obj.amount * obj.persons,
}
proposal.new_column = data
proposal.save()
这里,obj
是其他一些模型的实例,amount
是该模型的DecimalField
该逻辑在model类的save()
方法中运行良好。
但是在运行数据迁移时,我遇到了这个错误
TypeError:Decimal类型的对象不可JSON序列化
Stacktrace
Traceback (most recent call last):
File "./manage.py", line 21, in <module>
execute_from_command_line(sys.argv)
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
utility.execute()
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/core/management/__init__.py", line 375, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/core/management/base.py", line 323, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/core/management/base.py", line 364, in execute
output = self.handle(*args, **options)
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/core/management/base.py", line 83, in wrapped
res = handle_func(*args, **kwargs)
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/core/management/commands/migrate.py", line 234, in handle
fake_initial=fake_initial,
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/db/migrations/executor.py", line 117, in migrate
state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/db/migrations/executor.py", line 147, in _migrate_all_forwards
state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/db/migrations/executor.py", line 245, in apply_migration
state = migration.apply(state, schema_editor)
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/db/migrations/migration.py", line 124, in apply
operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/db/migrations/operations/special.py", line 190, in database_forwards
self.code(from_state.apps, schema_editor)
File "/home/simarpreet/Aegon/jarvis/insurance/travel/proposal/migrations/0006_auto_20191111_1943.py", line 34, in repopulate_slab_in_proposals
proposal.save()
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/db/models/base.py", line 741, in save
force_update=force_update, update_fields=update_fields)
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/db/models/base.py", line 779, in save_base
force_update, using, update_fields,
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/db/models/base.py", line 851, in _save_table
forced_update)
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/db/models/base.py", line 900, in _do_update
return filtered._update(values) > 0
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/db/models/query.py", line 760, in _update
return query.get_compiler(self.db).execute_sql(CURSOR)
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/db/models/sql/compiler.py", line 1429, in execute_sql
cursor = super().execute_sql(result_type)
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/db/models/sql/compiler.py", line 1100, in execute_sql
cursor.execute(sql, params)
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/db/backends/utils.py", line 99, in execute
return super().execute(sql, params)
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/db/backends/utils.py", line 67, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/db/backends/utils.py", line 76, in _execute_with_wrappers
return executor(sql, params, many, context)
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/psycopg2/_json.py", line 78, in getquoted
s = self.dumps(self.adapted)
File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/contrib/postgres/fields/jsonb.py", line 27, in dumps
return json.dumps(obj, **options)
File "/usr/lib/python3.7/json/__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "/usr/lib/python3.7/json/encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python3.7/json/encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "/usr/lib/python3.7/json/encoder.py", line 179, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type Decimal is not JSON serializable
回溯(最近一次呼叫最后一次):
文件“/manage.py”,第21行,在
从命令行(sys.argv)执行命令
文件“/home/simarpreet/Envs/j/lib/python3.7/site packages/django/core/management/_init__.py”,第381行,从命令行执行
utility.execute()
文件“/home/simarpreet/Envs/j/lib/python3.7/site packages/django/core/management/_init__.py”,执行中第375行
self.fetch_命令(子命令)。从_argv(self.argv)运行_
文件“/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/core/management/base.py”,第323行,运行于
self.execute(*args,**cmd_选项)
文件“/home/simarpreet/Envs/j/lib/python3.7/site packages/django/core/management/base.py”,第364行,在execute中
输出=self.handle(*args,**选项)
文件“/home/simarpreet/Envs/j/lib/python3.7/site-packages/django/core/management/base.py”,第83行,包装
res=句柄函数(*args,**kwargs)
handle中的文件“/home/simarpreet/Envs/j/lib/python3.7/site packages/django/core/management/commands/migrate.py”,第234行
假首字母=假首字母,
文件“/home/simarpreet/Envs/j/lib/python3.7/site packages/django/db/migrations/executor.py”,migrate中的第117行
状态=self.\u迁移\u所有\u转发(状态,计划,完整计划,假=假,假首字母=假首字母)
文件“/home/simarpreet/Envs/j/lib/python3.7/site packages/django/db/migrations/executor.py”,第147行,全部向前迁移
state=self.apply\u迁移(state,migration,false=false,false\u initial=false\u initial)
文件“/home/simarpreet/Envs/j/lib/python3.7/site packages/django/db/migrations/executor.py”,第245行,在apply_migration中
state=migration.apply(状态,模式编辑器)
文件“/home/simarpreet/Envs/j/lib/python3.7/site packages/django/db/migrations/migration.py”,第124行,在apply中
操作。数据库转发(self.app\u标签、模式编辑器、旧状态、项目状态)
数据库中的文件“/home/simarpreet/Envs/j/lib/python3.7/site packages/django/db/migrations/operations/special.py”,第190行
self.code(来自_state.apps,模式编辑器)
文件“/home/simarpreet/Aegon/jarvis/insurance/travel/proposal/migrations/0006_auto_20191111_1943.py”,第34行,在重新填充板中
建议保存()
文件“/home/simarpreet/Envs/j/lib/python3.7/site packages/django/db/models/base.py”,第741行,保存
强制更新=强制更新,更新字段=更新字段)
文件“/home/simarpreet/Envs/j/lib/python3.7/site packages/django/db/models/base.py”,第779行,在save_base中
强制更新,使用,更新字段,
文件“/home/simarpreet/Envs/j/lib/python3.7/site packages/django/db/models/base.py”,第851行,在保存表格中
强制更新)
文件“/home/simarpreet/Envs/j/lib/python3.7/site packages/django/db/models/base.py”,第900行,在更新中
返回已筛选的。\u更新(值)>0
文件“/home/simarpreet/Envs/j/lib/python3.7/site packages/django/db/models/query.py”,第760行,在更新中
返回query.get_编译器(self.db)。执行_sql(游标)
文件“/home/simarpreet/Envs/j/lib/python3.7/site packages/django/db/models/sql/compiler.py”,第1429行,在execute_sql中
cursor=super()。执行sql(结果类型)
文件“/home/simarpreet/Envs/j/lib/python3.7/site packages/django/db/models/sql/compiler.py”,第1100行,在execute_sql中
cursor.execute(sql,params)
文件“/home/simarpreet/Envs/j/lib/python3.7/site packages/django/db/backends/utils.py”,执行中的第99行
return super().execute(sql,params)
文件“/home/simarpreet/Envs/j/lib/python3.7/site packages/django/db/backends/utils.py”,执行中第67行
返回self.\u使用包装器执行(sql,params,many=False,executor=self.\u execute)
文件“/home/simarpreet/Envs/j/lib/python3.7/site packages/django/db/backends/utils.py”,第76行,使用包装器执行
返回执行器(sql、参数、多个、上下文)
文件“/home/simarpreet/Envs/j/lib/python3.7/site packages/django/db/backends/utils.py”,第84行,在
返回self.cursor.execute(sql,params)
文件“/home/simarpreet/Envs/j/lib/python3.7/site packages/psycopg2/_json.py”,第78行,在getquoted中
s=自转储(自适应)
文件“/home/simarpreet/Envs/j/lib/python3.7/site packages/django/contrib/postgres/fields/jsonb.py”,第27行,转储
返回json.dumps(obj,**选项)
文件“/usr/lib/python3.7/json/_init__.py”,第231行,转储
返回默认编码器编码(obj)
文件“/usr/lib/python3.7/json/encoder.py”,第199行,在encode中
chunks=self.iterencode(o,\u one\u shot=True)
iterencode中的文件“/usr/lib/python3.7/json/encoder.py”,第257行
返回_iterencode(o,0)
默认情况下,文件“/usr/lib/python3.7/json/encoder.py”第179行
raise TypeError(f'类型为{o.\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\的对象'
TypeError:Decimal类型的对象不可JSON序列化
但是根据Django data migration()的文档,Django可以序列化decimal.decimal值。
有人能告诉我为什么会出现此错误吗?我之所以会遇到此问题,是因为我在添加编码器后忘记运行迁移
new_column=pg_fields.JSONField(de