python - Django Rest Framework Json 数据猴子修补

标签 python json django django-rest-framework monkeypatching

我遇到了像 3.333333333 这样的 float 问题,我想让它成为 3.33。我不想更改此类值所在的所有 Serializer 类。有上千个序列化程序,它们有多个字段,其值类似于 3.333333333

能否请您帮我找到猴子修补类型的解决方案,以便我编写一个类或函数来仅转换浮点值。

最佳答案

我编写了一些代码使其正常工作。 我对以下文件进行了更改

settings.py

REST_FRAMEWORK = {
 'DEFAULT_RENDERER_CLASSES': (

    'utils.renderers.PalJSONRenderer',

    'rest_framework.renderers.BrowsableAPIRenderer',
 )}

utils/renderers.py

        from rest_framework.renderers import JSONRenderer
        from rest_framework.utils.encoders import JSONEncoder

        from json.encoder import encode_basestring_ascii, encode_basestring, INFINITY, _make_iterencode


        class CustomJSONEncoder(JSONEncoder):

            def iterencode(self, o, _one_shot=False):
                """Encode the given object and yield each string
                representation as available.

                For example::

                    for chunk in JSONEncoder().iterencode(bigobject):
                        mysocket.write(chunk)

                """
                # Hack to enforce
                c_make_encoder = None
                if self.check_circular:
                    markers = {}
                else:
                    markers = None
                if self.ensure_ascii:
                    _encoder = encode_basestring_ascii
                else:
                    _encoder = encode_basestring

                def floatstr(o, allow_nan=self.allow_nan, _repr=lambda o: format(o, '.2f'), _inf=INFINITY, _neginf=-INFINITY):
                    # Check for specials.  Note that this type of test is processor
                    # and/or platform-specific, so do tests which don't depend on the
                    # internals.

                    if o != o:
                        text = 'NaN'
                    elif o == _inf:
                        text = 'Infinity'
                    elif o == _neginf:
                        text = '-Infinity'
                    else:
                        return _repr(o)

                    if not allow_nan:
                        raise ValueError(
                            "Out of range float values are not JSON compliant: " +
                            repr(o))

                    return text

                if (_one_shot and c_make_encoder is not None and self.indent is None):
                    _iterencode = c_make_encoder(
                        markers, self.default, _encoder, self.indent,
                        self.key_separator, self.item_separator, self.sort_keys,
                        self.skipkeys, self.allow_nan)
                else:
                    _iterencode = _make_iterencode(
                        markers, self.default, _encoder, self.indent, floatstr,
                        self.key_separator, self.item_separator, self.sort_keys,
                        self.skipkeys, _one_shot)
                return _iterencode(o, 0)


        class PalJSONRenderer(JSONRenderer):
            encoder_class = CustomJSONEncoder

关于python - Django Rest Framework Json 数据猴子修补,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35939464/

相关文章:

python - 单元格之间没有线条的 Seaborn 热图

JavaScript:在 AWS Lambda 节点应用程序中将 RSS 转换为 JSON

java - 如何在 json 文件中编辑和添加嵌套数据?

python - Django-注册,自定义注册和验证

django - 如何限制用户对自己的模型进行投票

Python 和 MySQLdb - 使用 DROP TABLE IF EXISTS 似乎会抛出异常

python - 如何用 flask 中的请求信息丰富日志消息?

python - PDFKIT 找不到 wkhtmltopdf

javascript - 每次在 yii2 中使用带有 ajax 刷新的图表

python - 我对运行 Django 测试有点困惑