摘要:今天整理了一下在項目中如何使用環境如下第一步在中配置和配置如下可以同時使用和數據庫引擎你要存儲數據的庫名,事先要創建之數據庫用戶名密碼主機數據庫使用的端口連接中數據庫名稱為的數據庫第二步向中插入數據插入類型數據插入數據格式為插入含有的數據用
今天整理了一下在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/...
今天就聊到這里,如有問題,歡迎交流。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42715.html
摘要:今天整理了一下在項目中如何使用環境如下第一步在中配置和配置如下可以同時使用和數據庫引擎你要存儲數據的庫名,事先要創建之數據庫用戶名密碼主機數據庫使用的端口連接中數據庫名稱為的數據庫第二步向中插入數據插入類型數據插入數據格式為插入含有的數據用 今天整理了一下在django項目中如何使用mongodb, 環境如下:ubuntu18.04, django2.0.5, drf3.9, mong...
摘要:實現用戶管理程序對數據庫中文件的增加和修改。至此,所有和相關的功能數據庫等都這樣運作。管理器的使用和管理器一樣將會獲得一個帶有主鍵的對象。例如,對在中保存為一個數據表,在中保存為一個集合使用,函數名變為。 在Django項目中使用MongoDB作為后端數據庫,且不改變Django的ORM框架。實現Django用戶管理程序對MongoDB數據庫中文件的增加和修改。 用法 1.pip in...
摘要:實現用戶管理程序對數據庫中文件的增加和修改。至此,所有和相關的功能數據庫等都這樣運作。管理器的使用和管理器一樣將會獲得一個帶有主鍵的對象。例如,對在中保存為一個數據表,在中保存為一個集合使用,函數名變為。 在Django項目中使用MongoDB作為后端數據庫,且不改變Django的ORM框架。實現Django用戶管理程序對MongoDB數據庫中文件的增加和修改。 用法 1.pip in...
閱讀 2942·2021-10-28 09:32
閱讀 2967·2021-10-11 10:57
閱讀 3114·2021-10-08 10:05
閱讀 2588·2021-09-28 09:36
閱讀 2213·2019-08-30 15:55
閱讀 2270·2019-08-30 15:44
閱讀 2394·2019-08-30 14:02
閱讀 3076·2019-08-29 17:16