在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',
    }
}

此外,我们需要将创建好的应用添加到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

接下来,使用 Django 的命令进行迁移和启动服务器。

$python manage.py makemigrations quickstart
$python manage.py migrate
$python manage.py runserver

如果成功的话,应该会在localhost:8000进行监听。

get_author.png您可以通过此界面进行作者的查找和注册。

post_author.png

post_book.png最后,我们将尝试确认MongoDB中是否真的有数据。
启动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)

如果想要以更类似于MongoDB的方式存储数据,可以使用Djongo专有的EmbeddedModelField,这样可以将author作为book的嵌套文档存储在同一个集合中。这在根据需求使用时非常有用。详情请参考这篇文章。

最后。以上是所有步骤的完成。非常感谢!如果能对您有所帮助,我会很高兴。

这是最常用的Python MongoDB客户端。但是它本身不能进行模式验证等操作。

它是PyMongo的扩展版本,作为Python和MongoDB之间的O/R映射器工作。如果不考虑与Django的协作,可以使用这个。

据说它在内部将SQL转换为MongoDB查询。

bannerAds