2013-01-31 27 views
6

Uso Mongodb con mongoengine come backend per un'API in Django. Il framework che sto usando per creare l'api è Django Rest Framework.Dizionario dizionario restituzione Django Campo

Ho bisogno di memorizzare un dizionario in un campo in Mongo e il meglio che ho fatto quando viene chiamato il metodo è di usare un campo di dati e analizzare il dizionario nella funzione oggetto restore.

C'è un modo migliore per raggiungere questo obiettivo?

È preferibile creare un campo Dict? Non so quanto possa essere difficile.

Grazie.

modificato per mostrare del codice, notare che il dizionario viene memorizzato come dict (DictField) e il suo contenuto può cambiare da un oggetto all'altro.

mio modello mongoengine è qualcosa di simile:

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

e la mia serializzatore qualcosa di simile:

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

si potrebbe pubblicare il tuo definizioni del documento e del codice? Penso che sarebbe utile – dm03514

+0

Puoi usare i serializzatori pymongo - vedi: http://api.mongodb.org/python/current/api/bson/json_util.html – Ross

+0

Nel 2016 puoi usare Django-REST-Framework-Mongoengine (https://github.com/umutbozkurt/django-rest-framework-mongoengine), che fornisce i serializzatori per i documenti Mongoengine immediatamente disponibili. –

risposta

6

Piuttosto che affrontare il campo dizionario nel serializzatore del restore_object, probabilmente finirete con qualcosa di leggermente più pulito, se invece si utilizza un campo personalizzato per il campo del dizionario, che gestisce la conversione tra la rappresentazione del dizionario e la memoria interna basata su char.

Avrai bisogno di sottoclasse serializers.WritableField e sostituisci i metodi to_native() e from_native.

Relevant docs here.


Nota: classe WritableField che era presente nella versione 2.x non esiste più. È necessario eseguire la sottoclasse Field e sovrascrivere to_internal_value() se il campo supporta l'immissione dei dati.


Aggiornamento: A partire dal 3.0.4 è ora possibile utilizzare serializers.DictField ... http://www.django-rest-framework.org/api-guide/fields/#dictfield

Problemi correlati