Django dumpdata 将 int 序列化为字符串
Django dumpdata serializing an int as string
我一直在尝试制作自定义 class/type,在单独的 db.py 文件中定义,以便在执行时正确序列化为 int一个 manage.py dumpdata
命令,但是这个 BitFlagField 总是以字符串形式导出,值带有双引号,而其他整数字段在 JSON 文件中没有引号就可以正确导出。制作它的人大约一年前离开了这个地方,所以我无法从他那里得到任何帮助。
This is the class' code - 请注意,我已经修复了 __str__
函数并将 __repr__
更改为 return repr(self.value)
这是转储数据后的样子:(...), "blocked": "8"}}
;为了比较,另外两个整数字段没有用引号括起来的值:"pk": 1, "bit":8,
。因此,manage.py loaddata
失败:
django.core.serializers.base.DeserializationError: Problem installing fixture '/home/abcd/djangoapp/data.json': '>=' not supported between instances of 'str' and 'int': (core.userextra:pk=1) field_value was '8'
如果我手动删除 "blocked" 字段值中的引号,loaddata 命令会起作用。
如果我同时删除 __str__
和 __repr__
函数,对象类型就是最终的数据:(...), "blocked": "<core.db.BitFlag object at 0x7f9f2eb0bf40>"}}
。如果我将它们中的任何一个设为 return self.value
,它会抱怨它需要一个 str 类型。
我需要的是将该值作为 int 保存在 JSON 中,到目前为止我还没有成功,或者在某处反序列化它,但我无法弄清楚 where 部分,因为在我看来,这应该是一个简单的 return int(self.value)
.
在与多位同事交谈后,其中一位发现了这个问题。 BitFlagField
class 需要以下函数
def value_to_string(self, obj):
value = self.value_from_object(obj)
return self.get_prep_value(value)
添加它使转储数据按预期工作,字段被导出为 int。
"It was in the docs all along" - 是的,我不知道我是怎么错过的。
我一直在尝试制作自定义 class/type,在单独的 db.py 文件中定义,以便在执行时正确序列化为 int一个 manage.py dumpdata
命令,但是这个 BitFlagField 总是以字符串形式导出,值带有双引号,而其他整数字段在 JSON 文件中没有引号就可以正确导出。制作它的人大约一年前离开了这个地方,所以我无法从他那里得到任何帮助。
This is the class' code - 请注意,我已经修复了 __str__
函数并将 __repr__
更改为 return repr(self.value)
这是转储数据后的样子:(...), "blocked": "8"}}
;为了比较,另外两个整数字段没有用引号括起来的值:"pk": 1, "bit":8,
。因此,manage.py loaddata
失败:
django.core.serializers.base.DeserializationError: Problem installing fixture '/home/abcd/djangoapp/data.json': '>=' not supported between instances of 'str' and 'int': (core.userextra:pk=1) field_value was '8'
如果我手动删除 "blocked" 字段值中的引号,loaddata 命令会起作用。
如果我同时删除 __str__
和 __repr__
函数,对象类型就是最终的数据:(...), "blocked": "<core.db.BitFlag object at 0x7f9f2eb0bf40>"}}
。如果我将它们中的任何一个设为 return self.value
,它会抱怨它需要一个 str 类型。
我需要的是将该值作为 int 保存在 JSON 中,到目前为止我还没有成功,或者在某处反序列化它,但我无法弄清楚 where 部分,因为在我看来,这应该是一个简单的 return int(self.value)
.
在与多位同事交谈后,其中一位发现了这个问题。 BitFlagField
class 需要以下函数
def value_to_string(self, obj):
value = self.value_from_object(obj)
return self.get_prep_value(value)
添加它使转储数据按预期工作,字段被导出为 int。
"It was in the docs all along" - 是的,我不知道我是怎么错过的。