我们如何使用 djongo 库在 Django 中插入字典(json)?

问题描述 投票:0回答:3

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

我的做法是:

我们应该在

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 mongodb admin
3个回答
0
投票

不知道,但我写了一个 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!'))

希望这有帮助...


0
投票

我通过将这一行添加到序列化器中解决了这个问题:

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

注意:我正在使用 Djongo for MongoDB


0
投票

上述内容有更新吗? 我在这里使用 django 2.2 和 (python3 -m pip install django-jsonfield) 并且我的 json_data 字段在使用 post 时填充(在 mongo 中作为字符串),但在使用 DRF 执行 get 请求时从未显示。

© www.soinside.com 2019 - 2024. All rights reserved.