Overview
在本指南中,您可以学习;了解如何创建表示MongoDB集合的 Django 模型。模型是定义数据结构的Python类。 使用 Django MongoDB后端时,可以将每个模型映射到MongoDB集合,并使用模型对象与集合的文档交互。
提示
要学习;了解有关 Django 模型的更多信息,请参阅 Django 文档中的 Model
。
支持的字段
本节介绍 Django MongoDB后端对以下字段的支持,您可以将这些字段包含在模型中:
Django 字段
下表描述了 Django MongoDB后端支持的 Django 模型字段:
字段类型 | 说明 |
---|---|
| Stores IntegerField values up to 64 bits in size. |
| Stores raw binary data. |
| Stores boolean ( True or False ) values. |
| Stores string values. To store longer text values, use
TextField . |
| Stores date values in Python datetime.date instances. |
| Stores date and time values in Python datetime.datetime
instances. |
| Stores decimal values. |
| Stores values representing periods of time in
Python timedelta instances. |
| Stores CharField values and uses an EmailValidator
to verify that the value is an email address. |
| Stores file values. |
| Stores CharField values that represent filenames on your filesystem. |
| Stores float values. |
| Stores an IPv4 or IPv6 address in string format. |
| Stores a FileField value and verifies that the uploaded object
is a valid image. |
| Stores integer values up to 32 bits in size. |
| Stores JSON data. To learn more about this field, see the
Store JSON Data section in this guide. |
| Stores positive integer values up to 64 bits in size. |
| Stores positive integer values up to 32 bits in size. |
| Stores positive integer values up to 16 bits in size. |
| Stores a short text label, often for URL values. |
| Stores integer values up to 16 bits in size. |
| Stores large text values. |
| Stores a CharField value representing a URL. |
| Stores instances of Python's UUID class. |
MongoDB BSON字段
MongoDB以称为BSON的二进制表示形式组织和存储文档,从而支持灵活数据处理。
下表描述了支持的BSON字段类型以及您可以在 Django 模型中使用的 MongoDB MongoDB后端等效项:
BSON字段类型 | Django MongoDB后端字段类型 | BSON描述 |
---|---|---|
|
| Stores array values. To learn more about using this field
with Django MongoDB Backend, see the Store Array Data section
in this guide. |
|
| Stores one or multiple embedded documents. To learn more about using these fields
with Django MongoDB Backend, see the Store Embedded Model Data and Store Embedded Model Array Data
sections. |
|
| Stores unique 12-byte identifiers that MongoDB uses as primary keys. |
|
| Stores binary data. |
|
| Stores true or false values. |
|
| Stores dates and times in milliseconds since the Unix
epoch, or January 1, 1970. |
|
| Stores 28-bit decimal values. |
|
| Stores floating-point values. |
|
| Stores 32-bit signed integers. |
|
| Stores 64-bit signed integers. |
|
| Stores UTF-8 encoded string values. |
定义模型
要创建表示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()
构造函数在模型基类中创建一个字段并传递以下参数:
重要
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 文档中的模型字段参考。