Django Rest Framework Json数据猴子修补

vin*_*mar 7 python django json monkeypatching django-rest-framework

我遇到像3.333333333那样的浮点数问题,我想把它变成3.33.我不想改变Serializer这类价值来自的所有类.有数千个序列化器,它们有多个字段,其值为3.333333333.

你能帮我找一下猴子补丁类型的解决方案,这样我就可以编写一个类或函数来转换浮点值.

vin*_*mar 1

我做了一些代码,它的工作原理。我对以下文件进行了更改

设置.py

REST_FRAMEWORK = {
 'DEFAULT_RENDERER_CLASSES': (

    'utils.renderers.PalJSONRenderer',

    'rest_framework.renderers.BrowsableAPIRenderer',
 )}
Run Code Online (Sandbox Code Playgroud)

utils/渲染器.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
Run Code Online (Sandbox Code Playgroud)