django开发之mongodb的配置与使用

本篇文章给大家带来的内容是关于django开发之mongodb的配置与使用,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

今天整理了一下在django项目中如何使用mongodb, 环境如下:ubuntu18.04, django2.0.5, drf3.9, mongoengine0.16

第一步:在settings.py中配置mongodb和mysql,配置如下(可以同时使用mysql和mongodb):

DATABASES = {    'default': {        'ENGINE': 'django.db.backends.mysql',   # 数据库引擎        'NAME': 'django_test2',                  # 你要存储数据的库名,事先要创建之        'USER': 'root',                         # 数据库用户名        'PASSWORD': 'wyzane',                     # 密码        'HOST': 'localhost',                    # 主机        'PORT': '3306',                         # 数据库使用的端口    },    'mongotest': {        'ENGINE': None,    }}import mongoengine# 连接mongodb中数据库名称为mongotest5的数据库conn = mongoengine.connect("mongotest")

登录后复制

第二步:向mongodb中插入数据

1、插入json类型数据

models.py:    import mongoengine    class StudentModel(mongoengine.Document):        name = mongoengine.StringField(max_length=32)        age = mongoengine.IntField()        password = mongoengine.StringField(max_length=32)views.py:    from rest_framework.views import APIView    class FirstMongoView(APIView):        def post(self, request):            name = request.data["name"]            age = request.data["age"]            password = request.data["password"]            StudentModel.objects.create(name=name, age=age, password=password)            return Response(dict(msg="OK", code=10000))

登录后复制

插入数据格式为:

{    "name": "nihao",    "age": 18,    "password": "123456"}

登录后复制

2、插入含有list的json数据

models.py:    import mongoengine    class Student2Model(mongoengine.Document):        name = mongoengine.StringField(max_length=32)        # 用于存储list类型的数据        score = mongoengine.ListField()views.py:    from rest_framework.views import APIView    class FirstMongo2View(APIView):        def post(self, request):            name = request.data["name"]            score = request.data["score"]            Student2Model.objects.create(name=name, score=score)            return Response(dict(msg="OK", code=10000))

登录后复制

插入数据格式为:

{     "name": "test",     "score": [12, 13]}

登录后复制

3、插入含有dict和list的复杂json数据

models.py:    import mongoengine    class Student3Model(mongoengine.Document):        name = mongoengine.StringField(max_length=32)        # DictField用于存储字典类型的数据        score = mongoengine.DictField()views.py:    from rest_framework.views import APIView    class FirstMongo3View(APIView):        def post(self, request):            name = request.data["name"]            score = request.data["score"]            Student3Model.objects.create(name=name, score=score)            return Response(dict(msg="OK", code=10000))

登录后复制

插入数据格式为:

{    "name": "test",    "score": {"xiaoming": 12, "xiaoli": 13}}或者:{    "name": "test",    "score": {"xiaoming": 12, "xiaoli": {"xiaozhao": 14}}}或者:{"name": "test","score": {"xiaoming": 12, "xiaoli": {"xiaozhao": {"xiaoliu": 12, "xiaojian": 18}}}}或者:{"name": "test","score": {"xiaoming": 12, "xiaoli": {"xiaozhao": {"xiaoliu": 12, "xiaojian": [12,13,14]}}}}

登录后复制

第三步:查询mongodb中的数据

1、查询并序列化复杂json数据

serializers.py:    class StudentSerializer(serializers.Serializer):        name = serializers.CharField()        score = serializers.DictField()  # 序列化复杂的json数据        # DictField与EmbeddedDocumentField类似,但是比EmbeddedDocumentField更灵活views.py:    class FirstMongo4View(APIView):        def get(self, request):            student_info = Student3Model.objects.all()            # 增加过滤条件            # student_info = Student3Model.objects.filter(name="test1")            ser = StudentSerializer(instance=student_info, many=True)            return Response(dict(msg="OK", code="10000", data=ser.data))

登录后复制

2.序列化mongodb中含有嵌套关系的两个document

models.py:    class AuthorModel(mongoengine.EmbeddedDocument):        author_name = mongoengine.StringField(max_length=32)        age = mongoengine.IntField()    class BookModel(mongoengine.Document):        book_name = mongoengine.StringField(max_length=64)        publish = mongoengine.DateTimeField(default=datetime.datetime.utcnow())        words = mongoengine.IntField()        author = mongoengine.EmbeddedDocumentField(AuthorModel)serializers.py: 序列化时注意与rest_framework的序列化中DictField()的区别    from rest_framework_mongoengine import serializers as s1    class AuthorSerializer(s1.DocumentSerializer):          # DocumentSerializer继承自drf中的ModelSerializer,用于代替ModelSerializer序列化mongodb中的document.        # 具体可以到官网上查看        class Meta:            model = AuthorModel            fields = ('author_name', 'age')    class BookSerializer(s1.DocumentSerializer):        author = AuthorSerializer()        class Meta:            model = BookModel            fields = ('book_name', 'publish', 'words', 'author')    AuthorSerializer还可以这样写:    class AuthorSerializer(s1.EmbeddedDocumentSerializer):        # EmbeddedDocumentSerializer继承了DocumentSerializer        class Meta:            model = AuthorModel            fields = ('author_name', 'age')views.py:    class BookView(APIView):        def get(self, request):            """            查询数据            :param request:            :return:            """            books = BookModel.objects.all()            ser = BookSerializer(instance=books, many=True)            return Response(dict(msg="OK", code="10000", data=ser.data))

登录后复制

序列化mongodb中相关联的两个表时,如果序列化器继承自rest_framework中的Serializer和ModelSerializer,会抛出如下异常:

Django serialization to JSON error: 'MetaDict' object has no attribute 'concrete_model'

登录后复制

此时,序列化器需要继承自rest_framework_mongoengine的类,具体可以查看官网:
http://umutbozkurt.github.io/…

以上就是django开发之mongodb的配置与使用的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2534429.html

(0)
上一篇 2025年3月5日 21:30:58
下一篇 2025年2月23日 08:26:48

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 怎么找到黑客的联系方式?

    如果你想要找到黑客的联系方式,那么你可能面临以下难题:黑客往往会隐藏他们的身份,并且他们的联系方式很难被发现。php小编草莓在这里为你提供了一份指南,旨在帮助你找到黑客的联系方式。在本指南中,我们将介绍一些常见的黑客使用的联系方式,并提供一…

    2025年3月5日
    200
  • Python列表的长度调节方法(附代码)

    本篇文章给大家带来的内容是关于python列表的长度调节方法(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 Python 的列表(list)是一个非常灵活的数组,可以随意调整长度。正是因为这种便利,使得我们会情不…

    编程技术 2025年3月5日
    200
  • python中属性描述符的详细介绍(代码示例)

    本篇文章给大家带来的内容是关于python中属性描述符的详细介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 作为一个小白,每天都在不断地看东西,学知识,今天给大家介绍一个好东西——属性描述符 什么是属性描述…

    编程技术 2025年3月5日
    200
  • Python3中时间处理与定时任务的方法介绍(附代码)

    本篇文章给大家带来的内容是关于python3中时间处理与定时任务的方法介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 无论哪种编程语言,时间肯定都是非常重要的部分,今天来看一下python如何来处理时间和py…

    编程技术 2025年3月5日
    200
  • Python实现图片像素化的代码实例

    本篇文章给大家带来的内容是关于python实现图片像素化的代码实例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 起因 看到网上的像素图片,感觉蛮有趣的,就打算用python一些PIL类库写一个。 实现思路 把一张图片分成…

    2025年3月5日 编程技术
    200
  • Python中面向对象详细介绍(代码示例)

    本篇文章给大家带来的内容是关于python中面向对象详细介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 面向对象的三大特性:集成 多态 封装我们来学习一下在Python种三种特性的实现 继承 #继承demo…

    编程技术 2025年3月5日
    200
  • python中JWT的简单介绍

    本篇文章给大家带来的内容是关于python中jwt的简单介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((R…

    编程技术 2025年3月5日
    200
  • python基础题目总结(附答案)

    本篇文章给大家带来的内容是关于python基础题目总结(附答案),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、为什么学习Python? 人生苦短?人间不值得?想想自己的初心吧! 2、通过什么途径学习的Python? …

    编程技术 2025年3月5日
    200
  • Python中raise 与 raise … from之间有何区别?

    本篇文章给大家带来的内容是关于Python中raise 与 raise … from之间有何区别?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 起步 python 的 raise 和 raise from 之间…

    编程技术 2025年3月5日
    200
  • python中的yield关键字的用法介绍(代码示例)

    本篇文章给大家带来的内容是关于python中的yield关键字的用法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 yield是python的一个关键字,刚接触python的时候对这个关键字一知半解,掌握之…

    编程技术 2025年3月5日
    200

发表回复

登录后才能评论