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" - 是的,我不知道我是怎么错过的。