我正在使用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