我们如何使用djongo库将词典(JSON)与django一起插入MongoDB



我正在使用django,mongodb和djongo lib

构建REST API

我的要求是,我必须通过Djongo模型将动态JSON存储在MongoDB中。

data={"name":"xyz","age":12}
year=2017
month=10
class TestModel(models.Model):
    year = models.IntegerField()
    month = models.IntegerField()
    customer = "In this feild i want to store above dictonary"

我正在使用djongo库。

我的方法是:

我们应该在djongo/djongo/models.py

中添加EmbeddedDictField
class EmbeddedDictField(Field):
    def __init__(self,
                 model_container: typing.Type[dict],
                 model_form_class: typing.Type[forms.ModelForm] = None,
                 model_form_kwargs: dict = None,
                 *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.model_container = model_container
        self.model_form_class = model_form_class
        self.null = True
        self.instance = None
        if model_form_kwargs is None:
            model_form_kwargs = {}
        self.model_form_kwargs = model_form_kwargs
    def deconstruct(self):
        name, path, args, kwargs = super().deconstruct()
        kwargs['model_container'] = self.model_container
        if self.model_form_class is not None:
            kwargs['model_form_class'] = self.model_form_class
        return name, path, args, kwargs
    def pre_save(self, model_instance, add):
        value = getattr(model_instance, self.attname)
        # print(value)
        ret_val = {}
        # for fld in value._meta.get_fields():
        #     if not useful_field(fld):
        #         continue
        #
        #     fld_value = getattr(value, fld.attname)
        # ret_val[ self.attname] = fld.get_db_prep_value(value, None, False)
        ret_val[self.attname] = self.get_db_prep_value(value, None, False)
        return ret_val
    def get_db_prep_value(self, value, connection=None, prepared=False):
        if isinstance(value, dict):
            return value
        if not isinstance(value, Model):
            raise TypeError('Object must be of type Model')
        mdl_ob = {}
        for fld in value._meta.get_fields():
            if not useful_field(fld):
                continue
            fld_value = getattr(value, fld.attname)
            mdl_ob[fld.attname] = fld.get_db_prep_value(fld_value, connection, prepared)
        return mdl_ob
    def from_db_value(self, value, expression, connection, context):
        return self.to_python(value)

以便我们可以创建模型

tree = TestModel(year=year,month=month,customer =data)
tree.save()

这是做正确的方法吗?

不知道,但是我写了一个django管理命令,以尝试在引擎盖下添加原始JSON,可以这么说,称为test.py

它插入RAP_PROJECT表。

您然后像这样运行...

python manage.py Test

from django.core.management.base import BaseCommand, CommandError
import pprint
import os
import csv, json
from datetime import datetime
import pymongo
from pymongo import MongoClient
client = MongoClient()
dir_path = os.path.dirname(os.path.realpath(__file__))
class Command(BaseCommand):
    help = 'meant to help learn mongo'
    def add_arguments(self, parser):
        ''#parser.add_argument('file',  type=str)
    def handle(self, *args, **options):
        #filename  = options['file']
        try:
            print( client )
            db = client.monjo # MY DATABASE NAME
            projectstable = db.rap_project #MY TABLE NAME
            project = {
                "id": "lkhkahdsfkahds;fkhadsf",
                "title": "Hello There",
                "abstractText": "Let's see if this works",
                "status": "Open"
                }
            project_id = projectstable.insert_one(project).inserted_id
            print( project_id )
            pprint.pprint(projectstable.find_one())                     
        except Exception as err:
            raise CommandError( str(err))

        self.stdout.write(self.style.SUCCESS('Done!'))

希望这会有所帮助...

我通过将此行添加到序列化器中解决了它:

class CustomerSerializer(serializers.ModelSerializer):    
    customer = serializers.JSONField()

注意:我正在使用djongo for mongodb

最新更新