我的要求是,我必须通过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 库。
我的做法是:
我们应该在
EmbeddedDictField
中添加
djongo/djongo/models.py
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管理.py测试
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
上述内容有更新吗? 我在这里使用 django 2.2 和 (python3 -m pip install django-jsonfield) 并且我的 json_data 字段在使用 post 时填充(在 mongo 中作为字符串),但在使用 DRF 执行 get 请求时从未显示。