Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TypeError:在Django数据迁移期间,Decimal类型的对象不可JSON序列化_Django_Python 3.x_Postgresql_Django Migrations_Json Serialization - Fatal编程技术网

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