2016-03-11 19 views
5

Tôi đang đối mặt với một vấn đề với số phao như 3.333333333 và tôi muốn làm cho nó 3.33. Tôi không muốn thay đổi tất cả các lớp Serializer từ nơi loại giá trị này đến. Có hàng nghìn bộ nối tiếp và chúng có nhiều trường có các giá trị như 3.333333333.Django Rest Khung Json dữ liệu khỉ vá

Bạn có thể vui lòng giúp tôi tìm giải pháp loại đắp vá khỉ để tôi viết một lớp hoặc hàm để chỉ chuyển đổi các giá trị nổi.

+1

gì sai với trở 3,333333? mọi người tiêu dùng api của bạn có thể hiển thị nó là 3,33. Cho phép khách hàng xử lý định dạng. – Ali

+0

Trong Android, họ cần xác định kiểu dữ liệu như float, int hoặc long. giả sử dữ liệu ban đầu là ** 4.56 ** nhưng hiện tại đến ** 3.3333333 **. do đó rất khó để thay đổi tất cả các kiểu dữ liệu nổi từ lâu. thats lý do tại sao tôi cần giải pháp tại ** back-end ** không phải khách hàng kết thúc. –

+1

Tôi cho rằng vinay là đúng, tôi cũng phải đối mặt với cùng một vấn đề. chuyển đổi chúng từ phía khách hàng (đặc biệt là android không phải là một ý tưởng hay) @vinaykumar, mọi người sẽ vui vẻ trả lời câu hỏi của bạn, nếu bạn cũng viết ra những nỗ lực của mình (bạn đã thử gì) với câu hỏi. Tôi đoán bạn cần phải monkeypatch json.dumps đó là nhận được gọi là từ lớp JSONEncode. – Pawan

Trả lời

0

Tôi đã làm một số mã hoạt động. tôi đã thực hiện những thay đổi trong các tập tin sau đây

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 
Các vấn đề liên quan