2016-06-18 5 views
3

Django Rest Framework (rest_framework_mongoengine과 함께)를 사용하고 내 serializer의 to_representation()을 재정의하여 내 자신의 맞춤 JSON 객체를 다시 전송합니다. 모든 것이 잘 작동하지만 JSON 필드의 순서가 엉망입니다. JSON 객체를 다시 정렬/재구성하는 방법을 알려주십시오. 시리얼 라이저는 다음과 같습니다장고 Rest 프레임 워크 - json 응답을 재구성하는 방법?

class PharmacySerializer(DocumentSerializer): 
    bank_account = serializers.DictField(child=serializers.CharField(), required=False) 

    class Meta: 
     model = Pharmacy 
     fields = (
      'id', 'name', 'email', 'mobile', 'address_line_1', 'address_line_2', 
      'city', 'state', 'zip', 'created_by', 'created_on', 'last_updated_by', 'license_number', 
      'bank_account', 'last_updated_on', 'is_email_verified', 'is_mobile_verified', 'is_active') 
     read_only_fields = ('created_by', 'created_on', 'last_updated_by', 'last_updated_on', 'is_active') 

    def to_representation(self, pharmacy): 
     return { 
      'id': str(pharmacy.id), 
      'name': pharmacy.name, 
      'email': pharmacy.email, 
      'mobile': pharmacy.mobile, 
      'address_line_1': pharmacy.address_line_1, 
      'address_line_2': pharmacy.address_line_2, 
      'city': pharmacy.city, 
      'state': pharmacy.state, 
      'zip': pharmacy.zip, 
      'created_by': pharmacy.created_by, 
      'created_on': pharmacy.created_on, 
      'last_updated_by': pharmacy.last_updated_by, 
      'license_number': pharmacy.license_number, 
      'bank_account': { 
       'bank_name': pharmacy.bank_account.bank_name, 
       'account_number': pharmacy.bank_account.account_number, 
       'account_type': pharmacy.bank_account.account_type 
      }, 
      'last_updated_on': pharmacy.last_updated_on, 
      'is_email_verified': pharmacy.is_email_verified, 
      'is_mobile_verified': pharmacy.is_mobile_verified, 
      'is_active': pharmacy.is_active 
     } 

내가 얻고 있다는 반응이다 :

[ 
    { 
     "city": "City", 
     "name": "Some Pharmacy", 
     "zip": "778372", 
     "mobile": "9880082229", 
     "license_number": "SP22", 
     "is_mobile_verified": false, 
     "is_active": true, 
     "created_on": "2016-06-18T19:01:02.901", 
     "created_by": null, 
     "email": "[email protected]", 
     "state": "State", 
     "last_updated_by": null, 
     "is_email_verified": false, 
     "last_updated_on": "2016-06-18T19:01:02.901", 
     "address_line_2": null, 
     "id": "57659a6ea3b6561c0f20265e", 
     "bank_account": { 
      "bank_name": "HSBC", 
      "account_type": "Savings", 
      "account_number": "663822553" 
     }, 
     "address_line_1": "Address" 
    } 
] 

가 나는 그것이 to_representation의 반환 DICT()

+2

['OrderedDict'] (https://docs.python.org/2/library/collections.html#collections.OrderedDict)를 사용해 보셨습니까? – gdlmx

+0

작동하지 않았다 : ( – heaVenShaker

+0

@heaVenShaker'to_representation()'메서드를 재정의하는 특별한 이유가 있나? DRF가 정상적으로 반환 할 객체의 속성에 액세스하고있을 때 그렇게 할 필요가 없다고 생각합니다. 재정의하지 않고 주문한 응답을받을 수 있습니다. –

답변

3

, 당신은 OrderedDict. 사용할 수 있습니다하지만 당신에 대한 OrderedDicts을 기억해야 한 가지가있다 :

OrderedDict 순서를 유지에만 동안 키의 삽입. kwargs로 초기화하는 동안 순서가 손실됩니다. 그들의 순서는 일반 정렬되지 않은 사전을 사용 키워드 인수 통과에 파이썬의 함수 호출 때문에 의미를 상실 Python docs:

OrderedDict 생성자와 update() 방법 모두 키워드 인수를 사용할 수 있지만, 에서

.

먼저 OrderedDict 인스턴스를 만든 다음 하나씩 키를 추가해야합니다.

from collections import OrderedDict 

def to_representation(self, pharmacy): 
    ret = OrderedDict() # initialize on ordereddict 

    # insert keys one by one in desired oreder 
    ret['id'] = str(pharmacy.id) 
    ret['name'] = pharmacy.name 
    ret['email'] = pharmacy.email 
    ret['mobile'] = pharmacy.mobile 
    ret['address_line_1'] = pharmacy.address_line_1 
    ret['address_line_2'] = pharmacy.address_line_2 
    ret['city'] = pharmacy.city 
    ret['state'] = pharmacy.state 
    ret['zip'] = pharmacy.zip 
    ret['created_by'] = pharmacy.created_by 
    ret['created_on'] = pharmacy.created_on 
    ret['last_updated_by'] = pharmacy.last_updated_by 
    ret['license_number'] = pharmacy.license_number 
    ret['bank_account'] = { 
     'bank_name' = pharmacy.bank_account.bank_name 
     'account_number' = pharmacy.bank_account.account_number 
     'account_type' = pharmacy.bank_account.account_type 
    } 
    ret['last_updated_on'] = pharmacy.last_updated_on 
    ret['is_email_verified'] = pharmacy.is_email_verified 
    ret['is_mobile_verified'] = pharmacy.is_mobile_verified 
    ret['is_active'] = pharmacy.is_active 

    return ret 

참고 : 또 다른 옵션 (권장) 인 bank_account 필드 사용 EmbeddedDocumentSerializer합니다. 그런 다음 to_representation() 메서드를 재정의 할 필요가 없습니다.

+1

잘 했어! 덕분에 Rahul Gupta에게 감사드립니다 :) 많은 것을 – heaVenShaker

+1

서비스에 전념했습니다 ... @ Rahul –

3

와 같은 순서로되고 싶어 to_representationOrderedDict을 돌아보십시오 :

def to_representation(self, pharmacy): 
    return OrderedDict([('id', str(pharmacy.id),), ...]) 

디를 코드에서 ct 객체는 본질 상 순서가 지정되지 않습니다. 프레임 워크는 json.dump을 내부적으로 사용한다고 가정하고 주문한 객체를 사용하여 here으로 주문을 유지할 수 있습니다. 당신이 응답 키의 질서를 유지하려는 경우

+0

아니, 작동하지 않았어. ( – heaVenShaker

관련 문제