当前位置:Gxlcms > Python > django开发之mongodb的配置与使用

django开发之mongodb的配置与使用

时间:2021-07-01 10:21:17 帮助过:11人阅读

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

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

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

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

第二步:向mongodb中插入数据

1、插入json类型数据

  1. models.py:
  2. import mongoengine
  3. class StudentModel(mongoengine.Document):
  4. name = mongoengine.StringField(max_length=32)
  5. age = mongoengine.IntField()
  6. password = mongoengine.StringField(max_length=32)
  7. views.py:
  8. from rest_framework.views import APIView
  9. class FirstMongoView(APIView):
  10. def post(self, request):
  11. name = request.data["name"]
  12. age = request.data["age"]
  13. password = request.data["password"]
  14. StudentModel.objects.create(name=name, age=age, password=password)
  15. return Response(dict(msg="OK", code=10000))

插入数据格式为:

  1. {
  2. "name": "nihao",
  3. "age": 18,
  4. "password": "123456"
  5. }

2、插入含有list的json数据

  1. models.py:
  2. import mongoengine
  3. class Student2Model(mongoengine.Document):
  4. name = mongoengine.StringField(max_length=32)
  5. # 用于存储list类型的数据
  6. score = mongoengine.ListField()
  7. views.py:
  8. from rest_framework.views import APIView
  9. class FirstMongo2View(APIView):
  10. def post(self, request):
  11. name = request.data["name"]
  12. score = request.data["score"]
  13. Student2Model.objects.create(name=name, score=score)
  14. return Response(dict(msg="OK", code=10000))

插入数据格式为:

  1. {
  2. "name": "test",
  3. "score": [12, 13]
  4. }

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

  1. models.py:
  2. import mongoengine
  3. class Student3Model(mongoengine.Document):
  4. name = mongoengine.StringField(max_length=32)
  5. # DictField用于存储字典类型的数据
  6. score = mongoengine.DictField()
  7. views.py:
  8. from rest_framework.views import APIView
  9. class FirstMongo3View(APIView):
  10. def post(self, request):
  11. name = request.data["name"]
  12. score = request.data["score"]
  13. Student3Model.objects.create(name=name, score=score)
  14. return Response(dict(msg="OK", code=10000))

插入数据格式为:

  1. {
  2. "name": "test",
  3. "score": {"xiaoming": 12, "xiaoli": 13}
  4. }
  5. 或者:
  6. {
  7. "name": "test",
  8. "score": {"xiaoming": 12, "xiaoli": {"xiaozhao": 14}}
  9. }
  10. 或者:
  11. {
  12. "name": "test",
  13. "score": {"xiaoming": 12, "xiaoli": {"xiaozhao": {"xiaoliu": 12, "xiaojian": 18}}}
  14. }
  15. 或者:
  16. {
  17. "name": "test",
  18. "score": {"xiaoming": 12, "xiaoli": {"xiaozhao": {"xiaoliu": 12, "xiaojian": [12,13,14]}}}
  19. }

第三步:查询mongodb中的数据

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

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

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

  1. models.py:
  2. class AuthorModel(mongoengine.EmbeddedDocument):
  3. author_name = mongoengine.StringField(max_length=32)
  4. age = mongoengine.IntField()
  5. class BookModel(mongoengine.Document):
  6. book_name = mongoengine.StringField(max_length=64)
  7. publish = mongoengine.DateTimeField(default=datetime.datetime.utcnow())
  8. words = mongoengine.IntField()
  9. author = mongoengine.EmbeddedDocumentField(AuthorModel)
  10. serializers.py: 序列化时注意与rest_framework的序列化中DictField()的区别
  11. from rest_framework_mongoengine import serializers as s1
  12. class AuthorSerializer(s1.DocumentSerializer):
  13. # DocumentSerializer继承自drf中的ModelSerializer,用于代替ModelSerializer序列化mongodb中的document.
  14. # 具体可以到官网上查看
  15. class Meta:
  16. model = AuthorModel
  17. fields = ('author_name', 'age')
  18. class BookSerializer(s1.DocumentSerializer):
  19. author = AuthorSerializer()
  20. class Meta:
  21. model = BookModel
  22. fields = ('book_name', 'publish', 'words', 'author')
  23. AuthorSerializer还可以这样写:
  24. class AuthorSerializer(s1.EmbeddedDocumentSerializer):
  25. # EmbeddedDocumentSerializer继承了DocumentSerializer
  26. class Meta:
  27. model = AuthorModel
  28. fields = ('author_name', 'age')
  29. views.py:
  30. class BookView(APIView):
  31. def get(self, request):
  32. """
  33. 查询数据
  34. :param request:
  35. :return:
  36. """
  37. books = BookModel.objects.all()
  38. ser = BookSerializer(instance=books, many=True)
  39. return Response(dict(msg="OK", code="10000", data=ser.data))

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

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

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

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

人气教程排行