在Django-rest-framework中将MongoDB配置为数据库的方法
首先( )我在使用Django-rest-framework(DRF)与MongoDB进行搜索时发现有很多关于英文文章的结果,但我不确定最佳方法是什么,所以尝试了很多不同的方法后,个人觉得使用Djongo是最好的选择,并且对此进行了自己的总结。
这篇文章主要讨论的是
-
- DRF + Djongo + MongoDBの連携
- Djongoを利用したModel定義
我想以简短的方式介绍以下两个方面。
希望以下的内容对于初学者和正在考虑DRF和MongoDB联合使用的人们有所帮助。
环境Python 3.7.3
macOS Mojave 10.14.6
Python 3.7.3
苹果操作系统 Mojave 10.14.6
使用框架/库Django版本为2.1.7,djangorestframework版本为3.9.2,djongo版本为1.2.33。
在进行下一步之前,需要先执行 pip install 这些步骤。
在Python中,用于访问MongoDB的库有PyMongo1和mongoengine2等多种选择,但这次我们选择了Djongo,它可以方便地与Django进行集成。
以下是官方網站的連結:
https://nesdis.github.io/djongo/
這是官方的開始指南,可供參考:
https://nesdis.github.io/djongo/integrating-django-with-mongodb/
步驟那么,我们马上开始步骤。
首先根据以下内容,实现一个基于参考样本的REST API模板。
(直接使用别人的,抱歉哈,可以全文复制粘贴。)
https://www.django-rest-framework.org/tutorial/quickstart/
完成后应该会形成以下结构。
tutorial
├── db.sqlite3
├── manage.py
└── tutorial
├── __init__.py
├── quickstart
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── serializers.py
│ ├── tests.py
│ └── views.py
├── settings.py
├── urls.py
└── wsgi.py
目前,SQLite正在作为后端数据库运行。
我们将在这里开始更改配置以使用MongoDB。更改步骤大致分为两个。
-
- settings.pyの変更
- modelの修正
更改settings.py文件首先在settings.py文件中的DATABASES部分指定djongo。
DATABASES = {
'default': {
'ENGINE': 'djongo',
'NAME': 'sample',
}
}
DATABASES = {
'default': {
'ENGINE': 'djongo',
'NAME': 'sample',
}
}
此外,我们需要将创建好的应用添加到INSTALLED_APPS中进行注册。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'tutorial.quickstart', # これを追加
]
模型的修改
下面是一个选项的汉语改写:
接下来我们将修改model定义。不同于django-rest-framework的示例,这次我们将尝试创建自定义的Author和Book模型。
重要的是在这里,不是继承django的model,而是导入并继承djongo的models.Model。djongo的model基本上和django的默认model有相同的接口,因此可以使用相同的语法进行模式定义,还可以通过实例化的对象将数据写入MongoDB。此外,除了使用Django的field,model的field还可以使用由Djongo独自定义的field。
from djongo import models # djongoのモデルを利用する
class Author(models.Model):
name = models.TextField()
age = models.IntegerField(blank=True)
def __str__(self):
return self.name
class Book(models.Model):
title = models.TextField()
description = models.TextField()
author = models.ForeignKey(Author, on_delete=models.CASCADE)
由于模型已经修正,我们将重写serializers.py、views.py和urls.py,以便与最新定义的模型相匹配。
from tutorial.quickstart.models import Author, Book
from rest_framework import serializers
class AuthorSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Author
fields = ['name', 'age']
class BookSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Book
fields = ['title', 'description', 'author']
from tutorial.quickstart.models import Author, Book
from rest_framework import viewsets
from tutorial.quickstart.serializers import AuthorSerializer, BookSerializer
class AuthorViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.
"""
queryset = Author.objects.all()
serializer_class = AuthorSerializer
class BookViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows groups to be viewed or edited.
"""
queryset = Book.objects.all()
serializer_class = BookSerializer
(顺便说一句,通过使用django-rest-framework的viewset功能,在views.py中只需以下这些代码就可以实现全部的CRUD API。viewset非常方便。)
from django.urls import include, path
from rest_framework import routers
from tutorial.quickstart import views
router = routers.DefaultRouter()
router.register(r'authors', views.AuthorViewSet)
router.register(r'books', views.BookViewSet)
# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
path('', include(router.urls)),
path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
我已经完成了实现。
为了确认它是否可以正常运行,我将尝试启动。
迁移和服务器启动
我要启动 MongoDB。
sudo mongod
sudo mongod
接下来,使用 Django 的命令进行迁移和启动服务器。
$python manage.py makemigrations quickstart
$python manage.py migrate
$python manage.py runserver
如果成功的话,应该会在localhost:8000进行监听。



启动Mongo的交互式Shell。
mongo
您可以在对话式Shell中输入以下命令来进行确认。
> use sample
switched to db sample
>
> db.quickstart_author.find({})
{ "_id" : ObjectId("5e049aa6b7135ae9f9ce6862"), "id" : 2, "name" : "奈須きのこ", "age" : 46 }
>
> db.quickstart_book.find({})
{ "_id" : ObjectId("5e049ae7b7135ae9f9ce6865"), "id" : 2, "title" : "空の境界", "description" : "『空の境界』(からのきょうかい)は、奈須きのこによる日本の長編伝奇小説(Wikipediaより)", "author_id" : 2 }
和UI中的数据一样,已经正确地注册到MongoDB中了呢。
補充当查看Mongo中的内容时,可以看到集合分为两个部分进行了注册,即quickstart_author和quickstart_book。这是因为在模型定义时,使用了外键将这些模型连接起来。
author = models.ForeignKey(Author, on_delete=models.CASCADE)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
如果想要以更类似于MongoDB的方式存储数据,可以使用Djongo专有的EmbeddedModelField,这样可以将author作为book的嵌套文档存储在同一个集合中。这在根据需求使用时非常有用。详情请参考这篇文章。
最后。以上是所有步骤的完成。非常感谢!如果能对您有所帮助,我会很高兴。
这是最常用的Python MongoDB客户端。但是它本身不能进行模式验证等操作。
它是PyMongo的扩展版本,作为Python和MongoDB之间的O/R映射器工作。如果不考虑与Django的协作,可以使用这个。
据说它在内部将SQL转换为MongoDB查询。
这是最常用的Python MongoDB客户端。但是它本身不能进行模式验证等操作。
它是PyMongo的扩展版本,作为Python和MongoDB之间的O/R映射器工作。如果不考虑与Django的协作,可以使用这个。
据说它在内部将SQL转换为MongoDB查询。