Home >Backend Development >Python Tutorial >Configuration and use of mongodb for django development
The content of this article is about the configuration and use of mongodb in Django development. It has certain reference value. Friends in need can refer to it. I hope it will be helpful to you.
Today I sorted out how to use mongodb in the django project. The environment is as follows: ubuntu18.04, django2.0.5, drf3.9, mongoengine0.16
The first step: in Configure mongodb and mysql in settings.py. The configuration is as follows (mysql and mongodb can be used at the same time):
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")
Step 2: Insert data into mongodb
1. Insert json type data
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))
The format of the inserted data is:
{ "name": "nihao", "age": 18, "password": "123456" }
2. Insert the json data containing list
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))
The format of the inserted data is:
{ "name": "test", "score": [12, 13] }
3. Insert the data containing dict and The complex json data of list
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))
The insertion data format is:
{ "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]}}} }
Step 3: Query the data in mongodb
1. Query and serialize the complex json data
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. Serialize two documents with nested relationships in mongodb
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))
When serializing two related tables in mongodb, if the serializer inherits from the Serializer and ModelSerializer in rest_framework , the following exception will be thrown:
Django serialization to JSON error: 'MetaDict' object has no attribute 'concrete_model'
At this time, the serializer needs to inherit from the class of rest_framework_mongoengine. For details, you can check the official website:
http://umutbozkurt.github.io/...
The above is the detailed content of Configuration and use of mongodb for django development. For more information, please follow other related articles on the PHP Chinese website!