2013-01-31 29 views
6

Tôi đang sử dụng Mongodb với mongoengine làm phụ trợ cho API trong Django. Khung tôi đang sử dụng để tạo api là Django Rest Framework.Từ điển Django Rest Framework Dictionary

Tôi cần lưu trữ một từ điển trong một trường ở Mongo và tốt nhất tôi đã thực hiện khi phương thức đăng bài được gọi là sử dụng một từ và phân tích từ điển trong hàm restore_object.

Có cách nào tốt hơn để đạt được mục tiêu này?

Bạn nên tạo trường dict tốt hơn? Tôi không biết làm thế nào khó khăn này có thể được.

Cảm ơn bạn.

chỉnh sửa để hiển thị một số mã, lưu ý rằng tôi lưu trữ từ điển dưới dạng dict (DictField) và nội dung của nó có thể thay đổi từ một đối tượng này sang đối tượng khác.

mô hình mongoengine của tôi là một cái gì đó như:

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

và một cái gì đó serializer tôi như:

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

bạn có thể gửi tài liệu định nghĩa của bạn và một số mã? Tôi nghĩ rằng nó sẽ hữu ích – dm03514

+0

Bạn có thể sử dụng serializers pymongo - xem: http://api.mongodb.org/python/current/api/bson/json_util.html – Ross

+0

Trong năm 2016, bạn có thể sử dụng Django-REST-Framework-Mongoengine (https://github.com/umutbozkurt/django-rest-framework-mongoengine), cung cấp serializers cho tài liệu Mongoengine của bạn ra khỏi hộp. –

Trả lời

6

Thay vì thỏa thuận với các lĩnh vực từ điển trong của Serializer restore_object, có thể bạn sẽ kết thúc với một cái gì đó hơi sạch hơn, nếu thay vào đó bạn sử dụng một lĩnh vực tùy chỉnh cho lĩnh vực từ điển, mà quản lý chuyển đổi giữa các đại diện từ điển và lưu trữ dựa trên char nội bộ.

Bạn sẽ muốn phân lớp serializers.WritableField và ghi đè các phương thức to_native()from_native.

Relevant docs here.


Lưu ý: Lớp có thể ghi trong phiên bản 2.x không còn tồn tại. Bạn nên phân lớp Trường và ghi đè to_internal_value() nếu trường hỗ trợ nhập dữ liệu.


Cập nhật: Tính đến 3.0.4 bây giờ bạn có thể sử dụng serializers.DictField ... http://www.django-rest-framework.org/api-guide/fields/#dictfield

Các vấn đề liên quan