对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

创建模型来表示集合

在本指南中,您可以学习;了解如何创建表示MongoDB集合的 Django 模型。模型是定义数据结构的Python类。 使用 Django MongoDB后端时,可以将每个模型映射到MongoDB集合,并使用模型对象与集合的文档交互。

提示

要学习;了解有关 Django 模型的更多信息,请参阅 Django 文档中的 Model

本节介绍 Django MongoDB后端对以下字段的支持,您可以将这些字段包含在模型中:

下表描述了 Django MongoDB后端支持的 Django 模型字段:

字段类型
说明

BinaryField

存储原始二进制数据。

BooleanField

存储布尔值(TrueFalse)。

CharField

存储字符串值。 要存储更长的文本值,请使用 TextField

DateField

将日期值存储在Python datetime.date 实例中。

DateTimeField

将日期和时间值存储在Python datetime.datetime 实例中。

DecimalField

存储十进制值。

DurationField

将表示时间段的值存储在Python timedelta 实例中。

EmailField

存储CharField 值并使用EmailValidator 验证该值是否为电子邮件解决。

FileField

Stores file values.

FilePathField

存储表示文件系统上的文件名的 CharField 值。

FloatField

Stores float values.

GenericIPAddressField

以字符串格式存储 IPv4 或 IPv6解决。

ImageField

存储 FileField 值并验证上传的对象是否为有效图像。

IntegerFieldBigIntegerField

存储大小最多为 64 位的整数值。

JSONField

存储JSON数据。要学习;了解有关此字段的更多信息,请参阅本指南中的“存储JSON数据”部分。

PositiveIntegerFieldPositiveBigIntegerField

存储大小最多为 64 位的正整数值。

PositiveSmallIntegerField

存储大小最多为 32 位的正整数值。

SlugField

存储短文本标签,通常用于URL值。

SmallIntegerField

存储大小最多为 32 位的整数值。

TextField

存储较大的文本值。

URLField

存储表示URL 的CharField 值。

UUIDField

存储 Python 的 UUID 类的实例。

MongoDB以称为BSON的二进制表示形式组织和存储文档,从而支持灵活数据处理。

提示

要学习;了解有关MongoDB如何存储BSON数据的更多信息,请参阅MongoDB Server手册中的BSON 类型。

下表描述了支持的BSON字段类型以及您可以在 Django 模型中使用的 MongoDB MongoDB后端等效项:

BSON字段类型
Django MongoDB后端字段类型
BSON描述

Array

ArrayField

存储大量值。要学习;了解有关在 Django MongoDB后端使用此字段的更多信息,请参阅本指南中的“存储数组数据”部分。

Object

EmbeddedModelField or EmbeddedModelArrayField

存储一个或多个嵌入式文档。要学习;了解有关在 Django MongoDB后端使用这些字段的更多信息,请参阅“存储嵌入式模型数据”和“存储嵌入式模型数组数据”部分。

ObjectId

ObjectIdField

存储MongoDB用主节点 (primary node in the replica set)键的唯一 12 字节标识符。

Binary

BinaryField

存储二进制数据。

Boolean

BooleanField

存储 truefalse 值。

Date

DatetimeField

存储自 Unix 纪元或 1 月 1, 1970 以来的日期和时间(以毫秒为单位)。

Decimal128

DecimalField

存储 28 位十进制值。

Double

FloatField

存储浮点值。

Int32

SmallIntegerField

存储 32 位有符号整数。

Int64

IntegerField or BigIntegerField

存储 64 位有符号整数。

String

CharField or TextField

存储 UTF-8 编码的字符串值。

要创建表示MongoDB集合的模型,请将模型类定义添加到应用程序的 models.py文件中。 在模型类中,指定要存储的字段,并在内部 Meta 类中包含任何模型元数据。 您还可以使用 __str__() 方法定义模型的字符串表示形式。 使用以下语法定义模型:

class <Model name>(models.Model):
<field name> = <data type>
# Include additional fields here
class Meta:
# Include metadata here
def __str__(self):
# Include logic for displaying your model as a string here

提示

要详细学习;了解可在Meta 类中指定的元数据选项,请参阅 Django 文档中的模型元选项。

要使用模型,必须将它们添加到项目的 settings.py文件中。 编辑 INSTALLED_APPS 值以包含存储 models.py文件的模块的名称,如以下代码所示:

INSTALLED_APPS = [
'<application module>',
# Include other app modules here
]

最后,从项目的根目录运行以下数据库迁移命令,为模型创建MongoDB集合或使用现有集合存储模型数据:

python manage.py makemigrations <application name>
python manage.py migrate

此示例models.py文件定义了一个 Movie 模型类,其中包含以下信息:

  • 表示电影数据的字段列表。

  • Meta 类,将 db_table 选项设置为 movies。 这会指示 Django MongoDB后端使用此模型来表示Atlas示例数据集中的sample_mflix.movies 集合。

    Meta 类还将 managed 选项设置为 False,指示 Django MongoDB后端不要为模型创建新集合。

  • __str__() 方法,将模型的字符串表示形式定义为其 title字段值。

from django.db import models
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)
class Meta:
db_table = "movies"
managed = False
def __str__(self):
return self.title

提示

要学习;了解有关模型类定义中使用的字段的更多信息,请参阅本指南的支持的字段部分。

本节介绍如何在 Django 模型中使用以下字段:

您可以在模型中使用 JSONField 来存储JSON对象。 JSON是一种人类可读的数据交换格式,而JSON对象是将字符串键映射到值的数据容器。 MongoDB提供 Object字段类型来在文档中存储JSON数据,并在内部以BSON(二进制JSON)格式存储此数据。

注意

您还可以使用嵌入式模型和多态嵌入式模型来表示MongoDB Object

以下示例将JSONField 值添加到在本指南的定义模型示例中创建的模型。新字段名为 imdb,存储表示每个 Movie对象的用户评分的JSON数据:

from django.db import models
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)
imdb = models.JSONField(null=True, blank=True)
class Meta:
db_table = "movies"
managed = False
def __str__(self):
return self.title

提示

要学习;了解如何查询存储在 JSONField 中的数据,请参阅指定查询指南中的查询JSON值

Django MongoDB后端对 JSONField 的支持有以下限制:

  • 如果将该字段的值设立为 None,则 Django MongoDB后端会将其值存储为SQL NULL 值。 或者,您可以将 JSONField 值设立为 Value(None, JSONField()),它表示JSON标量 null。 但是,在查询时无法区分SQL NULL 和JSON null

  • 某些使用 Q 对象的查询可能不会返回预期结果,尤其是在使用 QuerySet.exclude() 方法时。

  • 查询具有 None 值的字段时,Django MongoDB后端会错误地返回不存在该字段的文档。

您可以在模型中使用 ArrayField 来存储数据列表。 要创建 ArrayField,请使用 ArrayField() 类构造函数并传递以下参数:

  • base_field:指定大量中存储的每个值的根本的数据类型。 不能将 EmbeddedModelFieldFileField 指定为基本字段类型。

  • size:(可选)指定大量的最大大小。

  • options : (可选)指定 Django字段选项。要查看可用选项列表,请参阅 Django 文档中的字段选项。

提示

您可以使用以下语法将大量值的大量存储在 ArrayField 中:

my_array = ArrayField(
ArrayField(
base_field,
# ... Additional arguments
),
)

以下示例将ArrayField 值添加到在本指南的定义模型示例中创建的模型。名为 genres 的新字段存储代表电影类型的 CharField 值的列表,并且最多可以存储5 个值:

from django.db import models
from django_mongodb_backend.fields import ArrayField
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)
genres = ArrayField(
models.CharField(max_length=100),
size=5,
null=True,
blank=True)
class Meta:
db_table = "movies"
managed = False
def __str__(self):
return self.title

提示

要学习了解如何查询存储在 ArrayField 中的数据,请参阅指定查询指南中的查询数组值

您可以使用 EmbeddedModelField 来表示MongoDB Object,用于存储嵌套文档值。 此类型允许一个模型在其字段之一中存储单独的模型。 要创建 EmbeddedModelField,请将嵌入式模型类定义为 EmbeddedModel 抽象模型的子类。 然后,使用 EmbeddedModelField() 构造函数在模型基类中创建一个字段并传递以下参数:

  • embedded_model:指定要存储的模型类。

  • options : (可选)指定 Django字段选项。要查看可用选项列表,请参阅 Django 文档中的字段选项。

重要

makemigrations Django 命令不会检测对嵌入式模型的更改。 如果您对嵌入式模型的类进行更改,则存储在 EmbeddedModelField 中的模型不会反映这些更改。

此示例将EmbeddedModelField 值添加到本指南的定义模型示例中创建的模型。名为 awards 的新字段将嵌入式 Award 模型存储为值。 以下代码定义 Award 模型并修改 Movie 模型以包含 EmbeddedModelField

from django.db import models
from django_mongodb_backend.models import EmbeddedModel
from django_mongodb_backend.fields import EmbeddedModelField
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)
class Meta:
db_table = "movies"
managed = False
def __str__(self):
return self.title

提示

要学习;了解如何查询存储在 EmbeddedModelField 中的数据,请参阅指定查询指南中的查询嵌入式模型值

您可以使用 EmbeddedModelArrayField 表示以一对多关系存储文档大量的MongoDB文档字段。大量中的每个文档都对应一个 Django MongoDB后端 EmbeddedModelField 值。要创建 EmbeddedModelArrayField,请使用 EmbeddedModelArrayField() 类构造函数并传递以下参数:

  • embedded_model:指定每个大量项中存储的模型。

  • max_size:(可选)指定大量的最大大小。

此示例将 EmbeddedModelArrayField 值添加到本指南的定义模型示例中创建的模型。此 cast字段存储嵌入式 Actor 模型的大量。以下代码定义 Actor 模型并修改 Movie 模型以包含 EmbeddedModelArrayField

from django.db import models
from django_mongodb_backend.models import EmbeddedModel
from django_mongodb_backend.fields import EmbeddedModelArrayField
class Actor(EmbeddedModel):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
role = 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)
cast = EmbeddedModelArrayField(Actor, null=True, blank=True)
class Meta:
db_table = "movies"
managed = False
def __str__(self):
return self.title

您可以使用 PolymorphicEmbeddedModelField 表示可以存储多种类型的嵌入式文档的MongoDB文档字段。每个嵌入式文档都由一个 Django MongoDB后端模型类表示。

要创建 PolymorphicEmbeddedModelField,请将 embedded_models 参数传递给 PolymorphicEmbeddedModelField() 类构造函数。该参数指定字段可以存储的模型类的列表。

此示例将 PolymorphicEmbeddedModelField 值添加到在本指南的定义模型示例中创建的模型。此 awards字段可以存储类型为 OscarsGoldenGlobes 的嵌入式模型。每个嵌入式模型都包含有关电影赢得的所有奥斯卡或金球奖的信息。

以下代码定义了 OscarsGoldenGlobes 嵌入式模型,然后修改 Movie 模型以包含 PolymorphicEmbeddedModelField

from django.db import models
from django_mongodb_backend.models import EmbeddedModel
from django_mongodb_backend.fields import PolymorphicEmbeddedModelField
class Oscars(EmbeddedModel):
wins = models.IntegerField(default=0)
nominations = models.IntegerField(default=0)
best_picture = models.BooleanField(default=False)
class GoldenGlobes(EmbeddedModel):
wins = models.IntegerField(default=0)
nominations = models.IntegerField(default=0)
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 = PolymorphicEmbeddedModelField(["Oscars", "GoldenGlobes"], null=True, blank=True)
class Meta:
db_table = "movies"
managed = False
def __str__(self):
return self.title

提示

要学习了解如何查询存储在 PolymorphicEmbeddedModelField 中的数据,请参阅指定查询指南中的查询多态嵌入式模型值

您可以使用 PolymorphicEmbeddedModelArrayField 表示可以存储多种类型的嵌入式文档的MongoDB文档字段。该字段与 PolymorphicEmbeddedModelField 类似,但它存储的是嵌入式文档的大量,而不是单个文档。大量中的每个嵌入式文档都由 Django MongoDB后端模型类表示。

要创建 PolymorphicEmbeddedModelArrayField,请将以下参数传递给 PolymorphicEmbeddedModelArrayField() 类构造函数:

  • embedded_models:指定字段可以存储的模型类

  • max_size(可选)指定大量的最大大小

此示例将 PolymorphicEmbeddedModelArrayField 值添加到在本指南的定义模型示例中创建的模型。此 awards字段可以存储类型为 OscarGoldenGlobe 的嵌入式模型列表。每个嵌入式模型都包含有关一部电影赢得的一个奥斯卡或金球奖的信息。

以下代码定义了 OscarGoldenGlobe 嵌入式模型,然后修改 Movie 模型以包含 PolymorphicEmbeddedModelArrayField

from django.db import models
from django_mongodb_backend.models import EmbeddedModel
from django_mongodb_backend.fields import PolymorphicEmbeddedModelArrayField
class Oscar(EmbeddedModel):
category = models.CharField(max_length=200)
year = models.IntegerField(default=0)
class GoldenGlobe(EmbeddedModel):
category = models.CharField(max_length=200)
year = models.IntegerField(default=0)
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 = PolymorphicEmbeddedModelArrayField(["Oscar", "GoldenGlobe"], null=True, blank=True)
class Meta:
db_table = "movies"
managed = False
def __str__(self):
return self.title

提示

要学习;了解如何查询存储在 PolymorphicEmbeddedModelArrayField 中的数据,请参阅指定查询指南中的查询多态嵌入式模型数组值

要学习;了解如何使用模型运行数据库操作,请参阅“与数据交互”指南。

要学习;了解有关 Django 字段的更多信息,请参阅 Django 文档中的模型字段参考