Django MongoDB 后端快速入门
本文由 Anaiya Raisinghani(MongoDB 开发倡导者)和 Nora Reidy(MongoDB 技术作家)撰写
有兴趣深入了解我们的Django MongoDB 后端集成吗?按照本快速入门指南创建一个 Django 应用程序,将该应用程序连接到 MongoDB 部署,确保您的部署托管在 MongoDB Atlas 上,并使用简单的 CRUD 操作与数据库中存储的数据进行交互。
什么是 Django?
首先,我们来了解一下Django是什么。Django 是一个用于构建 Web 应用程序的高速模型视图控制器框架。在项目中使用 Django 有很多关键优势,例如快速开发、丰富的服务选择、卓越的安全性以及卓越的可扩展性。Django 以其高效完成完美工作的最佳框架而自豪。正如我们将在本快速入门中看到的那样,使用我们的 Django MongoDB 后端集成,启动和运行起来非常简单。
先决条件
要成功完成此快速入门,您需要一些资源:
- IDE。本教程使用 Visual Studio Code。
- Python 3.10 或更高版本。我们建议在环境中使用 3.12。
- MongoDB Atlas 集群。
创建 MongoDB 集群
请按照以下步骤在我们的免费套餐集群上创建 MongoDB 集群(永久免费)。请确保正确设置“网络设置”,以便轻松连接到集群,并选择安全的用户名和密码。集群配置完成后,请确保将连接字符串保存在安全的地方以备后用。
将示例数据加载到集群中,并在连接字符串中指定与我们正在使用的示例数据库的连接sample_mflix
。通过在主机名后添加数据库名称来执行此操作,如下面的代码片段所示:
mongodb+srv://<username>:<password>@samplecluster.jkiff1s.mongodb.net/<database_name>?retryWrites=true&w=majority&appName=SampleCluster
现在我们的集群已经准备好了,我们可以创建我们的虚拟环境!
创建虚拟环境
我们的第一步是创建Python 虚拟环境。虚拟环境允许我们将特定项目所需的包和库保存在正确的环境中,而无需进行可能影响其他项目的全局更改。
为此,请运行:
python3.12 -m venv venv
然后运行:
source venv/bin/activate
一旦(venv)
终端中的目录名称旁边出现 ,就表示虚拟环境已正确配置。请通过以下命令仔细检查 Python 版本是否正确(3.10 及以上):
python —version
一旦虚拟环境设置好,我们就可以安装我们的 Django 集成!
安装 Django MongoDB 后端
要安装 Django 集成,请从终端运行以下命令:
pip install django-mongodb-backend
如果环境中同时安装了PyMongo和Django,请确保PyMongo版本在4.6~5.0之间,Django版本在5.0~5.1之间。
正确运行时,我们将在终端中看到以下内容:
一旦此步骤完成,我们的集成就会正确下载,以及成功所需的依赖项(包括 Django 和 PyMongo)。
创建您的 Django 项目!
一切就绪,我们就可以创建自己的 Django 项目了。此django-mongodb-project
模板与默认的 Django 项目模板大致相同,但有一些重要的变化。它包含特定于 MongoDB 的迁移,并且settings.py
文件已修改,以确保 Django 使用ObjectId值作为每个模型的主键。它还包含针对已设置的 Django 应用的 MongoDB 特定应用配置default_auto_field
。此库允许我们创建自己的应用,以便我们可以设置django_mongodb_backend.fields.ObjectIdAutoField
。
运行此命令来创建一个名为的新 Django 项目quickstart
:
django-admin startproject quickstart --template https://github.com/mongodb-labs/django-mongodb-project/archive/refs/heads/5.0.x.zip
一旦运行此命令,它将显示在项目文件的左侧:
一旦可以看到quickstart
项目,就该更新数据库设置了。为此,请转到文件夹settings.py
下的文件quickstart
并转到设置DATABASES
。将 替换”<connection string URI>”
为特定的集群 URI,包括示例数据库的名称:
DATABASES = {
"default": django_mongodb_backend.parse_uri("<connection string URI>"),
}
现在,我们可以确保已正确安装 Django MongoDB 后端,并且我们的项目已正确设置。请确保进入quickstart
文件夹并运行以下命令:
python manage.py runserver
点击链接或访问http://127.0.0.1:8000/。此页面将显示“恭喜!”以及一张火箭的图片:
现在我们知道设置已经成功,我们可以继续创建一个实际的应用程序,在其中我们可以与之前下载的示例数据进行交互!让我们开始吧。
为我们的“sample_mflix”数据创建应用程序
我们首先要创建我们的sample_mflix
应用程序。进入项目的根目录并运行此命令,基于我们的自定义模板创建一个应用程序:
python manage.py startapp sample_mflix --template https://github.com/mongodb-labs/django-mongodb-app/archive/refs/heads/5.0.x.zip
该django-mongodb-app
模板会确保你的apps.py
文件包含以下代码:“default_auto_field = 'django_mongodb.fields.ObjectIdAutoField'”。这确保BigAutoField
我们使用 MongoDB 特有的 ObjectId 功能,而不是 Django 原生的 ID 机制。
一旦您创建项目,我们将为我们的电影、观众和奖项数据创建模型。
为我们的电影、观众和奖项数据创建模型
要创建数据模型,我们要做的就是打开models.py
新创建的目录中的文件sample_mflix
,并用以下代码替换整个文件。
from django.db import models
from django.conf import settings
from django_mongodb_backend.fields import EmbeddedModelField, ArrayField
from django_mongodb_backend.models import EmbeddedModel
class Award(EmbeddedModel):
wins = models.IntegerField(default=0)
nominations = models.IntegerField(default=0)
text = models.CharField(max_length=100)
class Movie(models.Model):
title = models.CharField(max_length=200)
plot = models.TextField(blank=True)
runtime = models.IntegerField(default=0)
released = models.DateTimeField("release date", null=True, blank=True)
awards = EmbeddedModelField(Award, null=True, blank=True)
genres = ArrayField(models.CharField(max_length=100), null=True, blank=True)
class Meta:
db_table = "movies"
managed = False
def __str__(self):
return self.title
class Viewer(models.Model):
name = models.CharField(max_length=100)
email = models.CharField(max_length=200)
class Meta:
db_table = "users"
managed = False
def __str__(self):
return self.name
这里的模型Movie
代表我们的sample_mflix.movies
集合,存储各种电影的信息!Viewer
另一方面,模型代表sample_mflix.users
集合,存储电影流媒体平台的重要用户详细信息。Award
模型代表存储在Movie
模型中的嵌入文档值。
完成此操作并models.py
保存文件后,让我们创建视图来显示我们的数据。
创建视图来显示我们的数据
为了显示sample_mflix
数据库中的数据,我们将向文件添加视图views.py
。从目录中打开它sample_mflix
,并用下面的代码替换其中的内容。
在这里,我们显示一个登陆页面消息以及有关我们上面配置的Movie
和Viewer
模型的信息:
from django.http import HttpResponse
from django.shortcuts import render
from .models import Movie, Viewer
def index(request):
return HttpResponse("Hello, world. You're at the application index.")
def recent_movies(request):
movies = Movie.objects.order_by("-released")[:5]
return render(request, "recent_movies.html", {"movies": movies})
def viewers_list(request):
viewers = Viewer.objects.order_by("name")[:10]
return render(request, "viewers_list.html", {"viewers": viewers})
完成此部分后,我们就可以继续并为我们的视图配置 URL。
为我们的视图配置 URL
为了成功完成本节,我们需要在目录中创建一个名为urls.py
inside 的新文件sample_mflix
。此文件将我们在上一步中定义的视图映射到专用 URL。
将以下代码复制到这个新文件中:
from django.urls import path
from . import views
urlpatterns = [
path("recent_movies/", views.recent_movies, name="recent_movies"),
path("viewers_list/", views.viewers_list, name="viewers_list"),
path("", views.index, name="index")
]
复制完成后,我们可以继续我们的quickstart/urls.py
文件并使用以下代码替换文件的内容:
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path("admin/", admin.site.urls),
path("", include("sample_mflix.urls")),
]
一旦我们完成了文件内容的替换,我们就可以创建模板来正确格式化我们的数据。
创建模板来格式化您的数据
首先,在目录templates
中创建一个子目录sample_mflix
。创建完成后,recent_movies.html
在里面创建一个文件。我们将复制以下代码,用于格式化视图请求的电影数据recent_movies
:
<!-- templates/recent_movies.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Recent Movies</title>
</head>
<body>
<h1>Five Most Recent Movies</h1>
<ul>
{% for movie in movies %}
<li>
<strong>{{ movie.title }}</strong> (Released: {{ movie.released }})
</li>
{% empty %}
<li>No movies found.</li>
{% endfor %}
</ul>
</body>
</html>
在同一templates
子目录中创建另一个文件并将其命名为viewers_list.html
。此模板用于格式化视图所请求的用户数据viewers_list
。复制以下代码:
<!-- templates/viewers_list.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Viewers List</title>
</head>
<body>
<h1>Alphabetical Viewers List</h1>
<table>
<thead>
<tr>
<th>Name</th>
<th>Email</th>
</tr>
</thead>
<tbody>
{% for viewer in viewers %}
<tr>
<td>{{ viewer.name }}</td>
<td>{{ viewer.email }}</td>
</tr>
{% empty %}
<tr>
<td colspan="2">No viewer found.</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
现在您的模板已经到位,我们可以将我们的应用程序包含到我们的项目中!
将我们的应用程序纳入我们的项目
为此,请转到目录settings.py
中嵌套的文件quickstart
并编辑该INSTALLED_APPS
部分,如下所示:
INSTALLED_APPS = [
'sample_mflix.apps.SampleMflixConfig',
'quickstart.apps.MongoAdminConfig',
'quickstart.apps.MongoAuthConfig',
'quickstart.apps.MongoContentTypesConfig',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
完成后,我们可以为新模型创建迁移。
为您的新模型创建迁移
我们希望为Movie
、Award
和Viewer
模型创建迁移,并将所有这些更改应用到数据库。返回项目根目录并运行以下命令:
python manage.py makemigrations sample_mflix
python manage.py migrate
创建迁移后,我们就有了一个基本的 Django MongoDB 后端应用程序!我们可以用这个简单的应用程序与sample_mflix
数据库进行交互。这意味着可以对数据运行基本的 CRUD 操作。
那么,让我们来看看如何做到这一点。
写入数据
我们将使用 Python shell,因此请返回项目的根目录并使用以下命令启动 shell:
python manage.py shell
进入 shell 后,我们可以导入创建datetime
对象所需的类和模块。运行以下代码即可:
from sample_mflix.models import Movie, Award, Viewer
from django.utils import timezone
from datetime import datetime
现在,我们准备将电影插入数据库了!我们可以通过运行下面的代码来创建一个Movie
对象,该对象存储有关名为 的电影的数据“Minari”
,包括其奖项:
movie_awards = Award(wins=122, nominations=245, text="Won 1 Oscar")
movie = Movie.objects.create(
title="Minari",
plot="A Korean-American family moves to an Arkansas farm in search of their own American Dream",
runtime=217,
released=timezone.make_aware(datetime(2020, 1, 26)),
awards=movie_awards,
genres=["Drama", "Comedy"]
)
该Movie
对象实际上存储了有关电影的不正确数据:runtime
值列为217
,但正确值是117
。
让我们通过运行下面的代码来解决这个问题:
movie.runtime = 117
movie.save()
现在,让我们将一个查看器也插入到数据库中。我们可以通过创建一个Viewer
名为 的对象来实现,该对象存储了查看器的数据“Abigail Carter”
。运行以下代码即可完成此操作:
viewer = Viewer.objects.create(
name="Abigail Carter",
email="abigail.carter@fakegmail.com"
)
让我们删除一个Viewer
对象。名为“Alliser Thorne”的电影观看者不再是电影流媒体服务的成员。要移除此观看者,请运行以下代码:
old_viewer = Viewer.objects.filter(name="Alliser Thorne").first()
old_viewer.delete()
完成后,使用以下命令退出 shell:
exit()
确保我们在quickstart
目录中,然后使用此命令启动服务器:
python manage.py runserver
太棒了!现在我们可以检查一下Movies
模型是否正确插入数据库了。访问以下链接:
http://127.0.0.1: 8000/recent_movies/
您将看到以下内容,其中我们的最新电影位于最上方:
让我们Viewer
也检查一下我们的模型。访问链接:http://127.0.0.1: 8000/viewers_list / 。
我们的数据库中将列出 10 位观众的姓名。“Abigail Carter”将位于顶部,而“Alliser Thorne”将被删除:
完成这些步骤后,sample_mflix
示例数据库中的文档将被插入和编辑。
现在,我们可以查询数据库中的数据。
读回我们的数据
再次打开你的 Python shell,并确保你已经在“写入数据”步骤下首次创建 Python shell 时导入了必要的模块。
from sample_mflix.models import Movie, Award, Viewer
from django.utils import timezone
from datetime import datetime
一旦你的 shell 准备就绪,我们就可以查询用户集合中的特定电子邮件。
我们希望在集合中查询sample_mflix.users
电子邮件为 的用户”jason_momoa@gameofthron.es”
。请运行以下命令:
from sample_mflix.models import Movie, Viewer
Viewer.objects.filter(email="jason_momoa@gameofthron.es").first()
这将返回我们的用户的名称:
<Viewer: Khal Drogo>
现在,让我们查询电影集合中的运行时值。
在同一个 shell 中,运行以下代码,查找值runtime
小于的电影10
:
Movie.objects.filter(runtime__lt=10)
这将返回匹配的电影列表,如下面的屏幕截图所示:
完成此步骤后,即可随意对 MongoDB 集群内存储的任何数据运行查询!
让我们创建一个管理站点
可以创建一个 Django 管理站点,以便用户可以直接从 Web 界面编辑数据。
首先,创建一个管理员用户。在根目录运行以下代码:
python manage.py createsuperuser
终端将要求输入用户名、电子邮件地址和密码。请输入以下信息以创建具有指定凭据的用户:
Username: admin
Email address: admin@example.com
Password: <admin-password>
Password (again): <admin-password>
要进入管理站点,请运行以下代码:
python manage.py runserver
访问http://127.0.0.1:8000/admin/即可访问该网站。登录屏幕将会出现:
输入之前创建的名称和密码登录。
这里显示以下信息,用户可以通过选择表中的Groups
或行来编辑他们的项目身份验证配置。Users
Authentication and Authorization
让我们编辑示例集合中的数据users
。请记住,这些数据由模型表示,与管理面板中显示的行Viewer
无关。Users
前往sample_mflix/admin.py
文件并粘贴以下代码:
from django.contrib import admin
from .models import Viewer
admin.site.register(Viewer)
刷新 Django 管理站点,它将被更新:
现在,我们可以选择一个查看器对象了。点击Viewers
表格中的相应行SAMPLE_MFLIX
即可查看查看器列表,如下所示:
在列表顶部,点击Abigail Carter
。从这里,我们将能够看到Name
和Email
。
在这里,我们可以编辑信息(如果选择的话)。用户可以编辑任何字段,然后点击SAVE
按钮保存更改。
太棒了,你刚刚完成了 Django MongoDB 后端快速入门!在本快速入门中,你将:
- 创建了一个 Django 应用程序。
- 将您的 Django 应用程序连接到 MongoDB 部署。
- 确保您的部署托管在 MongoDB Atlas 上。
- 与集群内存储的数据进行交互。
- 创建了一个 Django 管理页面。
要了解有关 Django MongoDB 后端的更多信息,请访问文档和我们在 GitHub 上的仓库。如有任何疑问,请随时在我们的MongoDB 开发者论坛中与我们联系。
文章来源:https://dev.to/mongodb/django-mongodb-backend-quickstart-4o89