django mongodb mysql_django开发-mongodb的配置与使用

本文介绍了在Django项目中配置和使用MongoDB的步骤,包括在settings.py中配置数据库、向MongoDB插入JSON数据以及查询数据的方法。示例中详细展示了不同类型数据的插入和序列化操作。
摘要由CSDN通过智能技术生成

今天整理了一下在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/...

今天就聊到这里,如有问题,欢迎交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值