公告推出 MongoDB 8.0,史上最快的 MongoDB!阅读更多 >>推出 MongoDB 8.0,史上最快的 MongoDB!>>

如何使用Django与MongoDB

还不是MongoDB用户吗?

Python,数据科学中最受欢迎的编程语言,总是与MongoDB完美搭配,用于构建强大的应用程序。Django,最流行的Python网络框架,是构建使用MongoDB的安全且易于维护的应用程序的理想工具。

使用MongoDB与Django的优点是:

  • 每秒钟,越来越多的非结构化数据从聊天、实时流、信息和调查等各种来源生成。
  • 数据需要安全地存储在一个可扩展、性能良好且不僵硬的存储系统中,以便于数据分析和可视化。
  • 由于存储结构的简化,数据检索变得简单。这种简单性使得访问嵌套项变得容易,而且不需要复杂的连接。

MongoDB与Django满足上述标准并提供更多功能。这就是本教程将学习的内容。

关于MongoDB

MongoDB是一种灵活的、无模式的、JSON风格的、基于文档的数据库。以下是SQL和MongoDB在药店数据库中插入药品的对比示例。

                    
SQL   MongoDB   
SQL创建表/插入语句示例,用于向药店数据库添加药品    MongoDB插入语句示例,用于向药店数据库添加药品    

请注意,我们在创建集合的同时插入了一个记录。在MongoDB中,如果集合不存在,则会动态创建。

在SQL中,如果我们忘记提供medicine_id,由于它是主键(不可为空),记录将失败。而在MongoDB中,默认的主键字段是_id,我们可以不提供medicine_id就插入记录。

使用MongoDB的其他好处包括高可用性、索引和非依赖复杂连接。Atlas提供安全性、可扩展性、零停机补丁和升级。Atlas非常适合存储大量结构化和非结构化数据。

MongoDB Atlas

如果您将处理大数据,您将需要使用基于云的服务。这正是MongoDB Atlas支持无限集群的能力可以帮助的地方。您可以使用Atlas轻松部署、运行和扩展MongoDB。 了解更多关于MongoDB Atlas的信息。

按照MongoDB Atlas教程说明开始使用Atlas。

如何将Django连接到MongoDB?

有三种方法可以将Django连接到MongoDB

  1. PyMongo:PyMongo是MongoDB与Django交互的标准驱动程序。这是使用Python的官方和首选方式。PyMongo提供了执行所有数据库操作的功能,如搜索、删除、更新和插入。由于PyMongo与PyPI一起提供,您可以使用pip命令快速安装它。
  2. MongoEngine:MongoEngine是一个Python对象-文档映射器。它与关系数据库中的对象关系映射器类似。MongoEngine具有易于学习和使用的声明性API。
  3. Djongo:如果您正在使用SQL这样的关系型数据库,并希望迁移到MongoDB,您可以使用Djongo。Djongo无需更改Django ORM即可将所有SQL查询转换为MongoDB语法查询。

连接Django MongoDB的哪种方法更好?让我们在接下来的章节中探讨这个问题。

Django和MongoDB设置

为了使集成工作,您应该有一个Django和MongoDB设置。如果您在机器上安装了Python,您可以使用pip安装Django。如果您希望在一个特定环境中安装Django而不是整个系统,您可以创建一个虚拟环境。使用pip/pip3取决于您的Python版本

安装

Windows

pip install virtualenvwrapper-win

Mac OS / Linux

pip install virtualenvwrapper

创建

Windows

mkvirtualenv MyProjectEnvt

Mac OS / Linux

virtualenv MyProjectEnvt

激活

Mac OS / Linux

source MyProjectEnvt/bin/activate

Windows

workon MyProjectEnvt

要取消激活虚拟环境,只需键入命令deactivate

现在使用pip install Django安装Django。

要启动一个Django项目,转到您想要开始项目的文件夹,并使用以下命令

django-admin startproject <project_name>.

例如,

C:\Users\myuser\project_files>django-admin startproject MyFirstDjangoProj
C:\Users\myuser\project_files>cd MyFirstDjangoProj

要创建一个应用程序,请使用以下命令

python manage.py startapp myfirstapp

如果您使用的是 Python 版本 >= 3.0,请在命令中将 python 替换为 python3。

在应用程序中,我们可以拥有许多模型,这些模型将映射到 MongoDB 中的集合和文档。

一旦开始项目,所有文件都将可用在项目文件夹中。使用 python manage.py runserver 命令启动服务器。

您的 Django 设置现在已完成。

如果您还没有设置 MongoDB,请使用 MongoDB Atlas 来充分利用云托管。Atlas 与所有主要云服务提供商无缝协作。

使用 PyMongo 连接 Django 和 MongoDB

PyMongo 非常高效,可以将 JSON 数据写入 MongoDB,并允许在 Python 代码本身中使用 MongoDB 查询。我们可以使用 PyMongo 以字典语法检索数据。

使用 pip/pip3 命令轻松安装 PyMongo

pip install pymongo[snappy,gssapi,srv,tls]

如果您正在使用虚拟环境(您正在使用!),您必须在 ..\venv\Lib\site-packages 文件夹中安装 pymongo。

此外,使用以下命令安装 dnspython 以使用 mongodb+srv:// URI

pip install dnspython

使用 PyMongo,我们可以通过指定连接实例的正确数据库名称来并发运行多个数据库。

让我们创建一个样本 pymongo 会话。有两种方法可以实现这一点

  1. 我们可以在 utils 文件中创建一个客户端,该客户端可用于任何想要与 MongoDB 交互的视图。在项目文件夹中(与 manage.py 相同的位置)创建一个 utils.py 文件,并实例化客户端

    from pymongo import MongoClient
    def get_db_handle(db_name, host, port, username, password):
    
     client = MongoClient(host=host,
                          port=int(port),
                          username=username,
                          password=password
                         )
     db_handle = client['db_name']
     return db_handle, client

此方法可以用于 ./myfirstapp/view.py。

  1. 获取连接的另一种方法是使用连接字符串

    from pymongo import MongoClient
    client = MongoClient('connection_string')
    db = client['db_name']

    其中

    connection_string = mongodb+srv://<username>:<password>@<atlas cluster>
    /<myFirstDatabase>?retryWrites=true&w=majority

    例如,

    makemyrx_db = client['sample_medicines']
    #collection object
    medicines_collection = makemyrx_db['medicinedetails']

您可能已经在其他代码示例或教程中看到过 Connection 类的使用。Connection 已被弃用,因此不要使用它。

如果您在默认端口和主机上,只需调用 MongoClient()。要连接到 localhost,我们可以显式指定主机和端口,如下所示

MongoClient(‘localhost’, 27017)

或者

使用 URL 格式 MongoClient(‘mongodb://127.0.0.1: 27017/’)

由于我们已经在这里创建了客户端,因此需要在 settings.py 文件中注释掉 DATABASES 部分。使用三引号进行相同的注释。

使用 MongoEngine 连接 Django 和 MongoDB

MongoEngine 是 PyMongo 之上的一个 ORM 层。因此,您仍然需要在您的系统上安装 PyMongo (>=3.4) 以使用 MongoEngine。

使用 MongoEngine 连接 Django 和 MongoDB 可以让您使用 ListField 和 DictField 等字段来处理大量非结构化 JSON 数据。

首先,使用以下命令安装 MongoEngine

pip install mongoengine

如前所述,在使用 PyMongo 时,我们必须在 settings.py 中注释掉 DATABASES 部分。然后,为了使用 MongoEngine,添加以下内容

import mongoengine
mongoengine.connect(db=db_name, host=hostname, username=username, password=pwd)

在 MongoEngine 中,我们必须在 Django 应用程序的 models.py 文件中定义一个模式。MongoDB 是无模式的。模式仅在应用级别强制执行,使未来的更改快速且简单。

MongoEngine 与 Django 的默认 ORM 类似,但在 model.py 中有以下变化

Django 的 ORMMongoEngine
from django.db import models

from mongoengine import Document, fields from mongoengine import *

ModelDocument
models.CharFieldfields.StringField()

区别在于,当我们使用 MongoEngine 时,我们使用 models,它们被替换为 documentsfields

有许多其他工具被编写来与PyMongo一起使用。

使用Djongo连接Django和MongoDB

Djongo在PyMongo之上进行了改进,因为开发人员无需编写冗长的查询。它将Python对象映射到MongoDB文档,即对象文档映射(ODM)。Djongo确保只有干净的数据进入数据库。通过使用Djongo执行完整性检查、应用验证等,无需修改现有的Django ORM。

安装Djongo

pip install djongo

现在,进入您的项目文件夹(例如,MyFirstDjangoProj),并打开settings.py文件。您可以使用Textpad、Python IDE或任何编辑器进行编辑。搜索DATABASES,并将设置更改为指向MongoDB。ENGINE将是djongo,而数据库名称(NAME)将是您的MongoDB数据库名称。

DATABASES = {
       'default': {
           'ENGINE': 'djongo',
           'NAME': 'db-name',
       }
   }

如果您的数据库不在localhost上或受到保护,您还应填写客户端信息,如HOST、USERNAME、PASSWORD等。

DATABASES = {
        'default': {
            'ENGINE': 'djongo',
            'NAME': 'your-db-name',
            'ENFORCE_SCHEMA': False,
            'CLIENT': {
                'host': 'mongodb+srv://<username>:<password>@<atlas cluster>/<myFirstDatabase>?retryWrites=true&w=majority'
            }  
        }
}

请确保在settings.py的INSTALLED_APPS设置中添加了app-name

INSTALLED_APPS = [
    'myfirstapp',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

现在我们有了Django项目(和应用程序),您可以使用以下命令在MongoDB中创建集合

python manage.py makemigrations <app-name>
python manage.py migrate

集合(应用程序中的Django模型——注意我们是在谈论应用程序而不是项目)将被创建。您可以通过打开Django Admin来检查相同的内容。

您可以使用Admin GUI或手动向集合中插入数据。

要使用管理控制台,请打开您的浏览器并转到http://127.0.0.1:8000/admin(或localhost)。您应该创建一个超级用户以进入管理控制台。如果您在您的应用程序中没有任何模型,请遵循Django教程,了解如何创建和注册模型

如果您想让Djongo无迁移,请在数据库配置中将ENFORCE_SCHEMA: False设置为False。使用此设置,集合会即时创建,而Djongo不会将SQL语句转换为MongoDB命令。

Django和MongoDB教程

(您可以随时一起编写代码或从本GitHub存储库中下载完整代码。)

在本快速教程中,我们将演示如何使用PyMongo进行简单的CRUD操作。为此,让我们创建一个PyMongo会话

import pymongo
#connect_string = 'mongodb+srv://<username>:<password>@<atlas cluster>/<myFirstDatabase>?retryWrites=true&w=majority' 

from django.conf import settings
my_client = pymongo.MongoClient(connect_string)

# First define the database name
dbname = my_client['sample_medicines']

# Now get/create collection name (remember that you will see the database in your mongodb cluster only after you create a collection
collection_name = dbname["medicinedetails"]

#let's create two documents
medicine_1 = {
    "medicine_id": "RR000123456",
    "common_name" : "Paracetamol",
    "scientific_name" : "",
    "available" : "Y",
    "category": "fever"
}
medicine_2 = {
    "medicine_id": "RR000342522",
    "common_name" : "Metformin",
    "scientific_name" : "",
    "available" : "Y",
    "category" : "type 2 diabetes"
}
# Insert the documents
collection_name.insert_many([medicine_1,medicine_2])
# Check the count
count = collection_name.count()
print(count)

# Read the documents
med_details = collection_name.find({})
# Print on the terminal
for r in med_details:
    print(r["common_name"])
# Update one document
update_data = collection_name.update_one({'medicine_id':'RR000123456'}, {'$set':{'common_name':'Paracetamol 500'}})

# Delete one document
delete_data = collection_name.delete_one({'medicine_id':'RR000123456'})

接下来,您可以连接到您的MongoDB Atlas集群并验证相同的内容。单击集合,您可以在左侧看到新创建的数据库和集合: database view

在右侧,您将看到一条记录(因为我们已删除一条): query results

下一步

现在我们知道了连接Django和MongoDB的不同方式,我们必须为我们的项目选择正确的方法。这些方法都有其自身的优缺点。

例如,如果您是从零开始,MongoEngine是一个不错的选择,因为它可以轻松处理大量非结构化数据。如果您在应用程序中需要编写大量复杂查询,则应选择PyMongo。

如果您有一个需要从其他数据库迁移到MongoDB的Django项目,Djongo更合适,因为这将需要最少的代码更改。

准备好开始了吗?

如果您将处理大数据,您将需要使用基于云的服务。这正是MongoDB Atlas支持无限集群的能力所在。

常见问题解答

我可以用MongoDB与Django一起使用吗?

是的,有三种方法可以使用MongoDB与Django一起使用。

  • PyMongo是连接MongoDB与Django的官方方式,并得到MongoDB的支持。它是MongoDB的原生Python驱动程序。它支持MongoDB版本2.6、3.x、4.0和4.2。
  • MongoEngine 是一种文档对象映射器,类似于关系型数据库中的 ORM。它使用声明性 API 来构建使用 MongoDB 的 Django 项目。它是一个提供在 PyMongo 之上的抽象的库。
  • Djongo 是一个 Django 项目用于将 SQL 转换为 MongoDB 的转换器,它是传统 Django ORM 框架的扩展。Djongo 将 Python 对象映射到 MongoDB 文档。

什么是 Django 和 MongoDB?

Django 是一个非常流行的 Python 网络应用框架。MongoDB 提供了一种高度可扩展、灵活的方式来存储和检索大量非结构化数据。结合 Django 和 MongoDB 可以获得两者的优点以及高性能的应用程序。

Django 如何连接到 MongoDB?

连接 Django 和 MongoDB 有三种方式。它们是 PyMongo、MongoEngine 和 Djongo。

PyMongo 是连接 Django 和 MongoDB 的官方支持方式。使用 MongoEngine 为 Django 模型对象中的 Python 列表和字典对象提供额外的支持。如果你的项目使用关系型数据库,并且想要迁移到非关系型数据库,如 MongoDB,那么 Djongo 是一个不错的选择,它可以转换 SQL 查询字符串为 MongoDB 查询文档。

哪种数据库最适合 Django?

Django 是一个 Python 的网络框架,最出名的是其在数据科学领域的应用。虽然关系型数据库由于其使用而非常流行。但由于可扩展性、可用性和灵活性,开发者开始转向 NoSQL 数据库。MongoDB 是最受欢迎的 NoSQL 数据库之一,它以集合和文档的形式存储非结构化数据,便于检索。MongoDB 还提供了 图表,你可以通过它执行简单的聚合操作和查看有助于数据分析的可视化。