2013-01-31 4 views
6

장고의 API 백엔드로 mongoengine과 함께 Mongodb를 사용하고 있습니다. API를 생성하기 위해 사용하고있는 프레임 워크는 Django Rest Framework입니다.Django Rest 프레임 워크 사전 필드

Mongo의 필드에 사전을 저장할 필요가 있습니다. 메소드 게시가 호출 될 때 수행 한 최선의 작업은 charfield를 사용하고 restore_object 함수에서 사전을 구문 분석하는 것입니다.

이 목표를 달성하는 더 좋은 방법이 있습니까?

dict 필드를 만드는 것이 좋습니다. 나는 이것이 얼마나 힘들 수 있는지 모른다.

감사합니다.

일부 코드를 표시하도록 편집 한 경우 사전을 Dict (DictField)로 저장하고 그 내용이 한 개체에서 다른 개체로 변경 될 수 있습니다.

내 mongoengine 모델은 뭔가 같은 :

class MyDoc(mongoengine.Document): 
    name = mongoengine.StringField(max_length=200) 
    context = mongoengine.DictField() 

과 같은 내 시리얼 뭔가 :

class MyDocSerializer(serializers.Serializer): 

name = serializers.CharField(max_length=200) 
context = serializers.CharField() 
url = serializers.HyperlinkedIdentityField(
view_name="drf:mydoc-detail",) 

def __init__(self,*args,**kwargs): 
    super(MyDocSerializer,self).__init__(*args,**kwargs) 


def restore_object(self, attrs, instance=None): 

    #Parse string to dict 
    #this is so ugly, notice I had to repace ' for " to 
    #avoid an error parsing the json 
    context = JSONParser().parse(
    StringIO.StringIO(
     attrs['context'].replace("'","\"") 
    ) 
    ) 

    attrs['context'] = context 
    if instance is not None: 
     instance.name = attrs['name'] 
     instance.context = context 
     return instance 

    return MyDoc(**attrs) 
+0

http://www.django-rest-framework.org/api-guide/fields/#dictfield 당신이 문서의 정의와 몇 가지 코드를 게시 할 수 있을까? 나는 그것이 도움이 될 것이라고 생각한다 – dm03514

+0

당신은 pymongo 시리얼 라이저를 사용할 수있다 - http://api.mongodb.org/python/current/api/bson/json_util.html – Ross

+0

2016 년에는 Django-REST-Framework-Mongoengine을 사용할 수있다. (https://github.com/umutbozkurt/django-rest-framework-mongoengine), 당신의 몽고어 문서에 대한 시리얼 라이저를 제공합니다. –

답변

6

오히려 시리얼의 restore_object의 사전 필드 거래보다, 당신은 아마 될 겁니다 사전 필드와 내부 문자 기반 저장소 간의 변환을 관리하는 사용자 정의 필드를 사전 필드로 사용하는 경우 약간 더 깔끔합니다.

serializers.WritableField의 하위 클래스를 지정하고 to_native()from_native 메서드를 재정의 할 수 있습니다.

Relevant docs here.


참고 : 버전 2.x에 있던 WritableField 클래스는 더 이상 존재하지 않습니다. 필드가 데이터 입력을 지원하면 Field를 서브 클래스 화하고 to_internal_value()를 재정의해야합니다.


업데이트 : 3.0.4으로 지금 serializers.DictField을 사용할 수 있습니다 ...