이 글의 내용은 Django 개발에서 mongodb의 구성과 사용에 관한 것입니다. 필요한 친구들이 참고할 수 있기를 바랍니다.
오늘은 django 프로젝트에서 mongodb를 사용하는 방법을 정리했습니다. 환경은 ubuntu18.04, django2.0.5, drf3.9, mongoengine0.16
1단계: 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")
2단계: 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가 포함된 데이터
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]}}} }
3단계: 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에서 중첩 관계가 있는 두 문서 직렬화
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 구성 및 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!