最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

django开发之mongodb的配置与使用

来源:懂视网 责编:小采 时间:2020-11-27 14:20:34
文档

django开发之mongodb的配置与使用

django开发之mongodb的配置与使用:本篇文章给大家带来的内容是关于django开发之mongodb的配置与使用,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。今天整理了一下在django项目中如何使用mongodb, 环境如下:ubuntu18.04, django2.0.5, drf3.9, mong
推荐度:
导读django开发之mongodb的配置与使用:本篇文章给大家带来的内容是关于django开发之mongodb的配置与使用,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。今天整理了一下在django项目中如何使用mongodb, 环境如下:ubuntu18.04, django2.0.5, drf3.9, mong

本篇文章给大家带来的内容是关于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的配置与使用

django开发之mongodb的配置与使用:本篇文章给大家带来的内容是关于django开发之mongodb的配置与使用,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。今天整理了一下在django项目中如何使用mongodb, 环境如下:ubuntu18.04, django2.0.5, drf3.9, mong
推荐度:
标签: 配置 python mongodb
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top