Overview
在本指南中,您可以学习;了解如何创建表示MongoDB集合的 Django 模型。模型是定义数据结构的Python类。 使用 Django MongoDB后端时,可以将每个模型映射到MongoDB集合,并使用模型对象与集合的文档交互。
提示
要学习;了解有关 Django 模型的更多信息,请参阅 Django 文档中的 Model。
支持的字段
本节介绍 Django MongoDB后端对以下字段的支持,您可以将这些字段包含在模型中:
Django 字段
下表描述了 Django MongoDB后端支持的 Django 模型字段:
字段类型 | 说明 |
|---|---|
| 存储原始二进制数据。 |
| 存储布尔值( |
| 存储字符串值。 要存储更长的文本值,请使用 |
| 将日期值存储在Python |
| 将日期和时间值存储在Python |
| 存储十进制值。 |
| 将表示时间段的值存储在Python |
| 存储 |
| Stores file values. |
| 存储表示文件系统上的文件名的 |
| Stores float values. |
| 以字符串格式存储 IPv4 或 IPv6解决。 |
| 存储 |
| 存储大小最多为 64 位的整数值。 |
| |
| 存储大小最多为 64 位的正整数值。 |
| 存储大小最多为 32 位的正整数值。 |
| 存储短文本标签,通常用于URL值。 |
| 存储大小最多为 32 位的整数值。 |
| 存储较大的文本值。 |
| 存储表示URL 的 |
| 存储 Python 的 |
MongoDB BSON字段
MongoDB以称为BSON的二进制表示形式组织和存储文档,从而支持灵活数据处理。
下表描述了支持的BSON字段类型以及您可以在 Django 模型中使用的 MongoDB MongoDB后端等效项:
BSON字段类型 | Django MongoDB后端字段类型 | BSON描述 |
|---|---|---|
|
| |
|
| |
|
| 存储MongoDB用主节点 (primary node in the replica set)键的唯一 12 字节标识符。 |
|
| 存储二进制数据。 |
|
| 存储 |
|
| 存储自 Unix 纪元或 1 月 1, 1970 以来的日期和时间(以毫秒为单位)。 |
|
| 存储 28 位十进制值。 |
|
| 存储浮点值。 |
|
| 存储 32 位有符号整数。 |
|
| 存储 64 位有符号整数。 |
|
| 存储 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
要使用模型,必须将它们添加到项目的 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 模型中使用以下字段:
Store JSON Data
您可以在模型中使用 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后端会将其值存储为SQLNULL值。 或者,您可以将JSONField值设立为Value(None, JSONField()),它表示JSON标量null。 但是,在查询时无法区分SQLNULL和JSONnull。某些使用
Q对象的查询可能不会返回预期结果,尤其是在使用QuerySet.exclude()方法时。查询具有
None值的字段时,Django MongoDB后端会错误地返回不存在该字段的文档。
存储数组数据
您可以在模型中使用 ArrayField 来存储数据列表。 要创建 ArrayField,请使用 ArrayField() 类构造函数并传递以下参数:
base_field:指定大量中存储的每个值的根本的数据类型。 不能将EmbeddedModelField或FileField指定为基本字段类型。size:(可选)指定大量的最大大小。
提示
您可以使用以下语法将大量值的大量存储在 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:指定要存储的模型类。
重要
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字段可以存储类型为 Oscars 或 GoldenGlobes 的嵌入式模型。每个嵌入式模型都包含有关电影赢得的所有奥斯卡或金球奖的信息。
以下代码定义了 Oscars 和 GoldenGlobes 嵌入式模型,然后修改 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字段可以存储类型为 Oscar 或 GoldenGlobe 的嵌入式模型列表。每个嵌入式模型都包含有关一部电影赢得的一个奥斯卡或金球奖的信息。
以下代码定义了 Oscar 和 GoldenGlobe 嵌入式模型,然后修改 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 文档中的模型字段参考。