建立文档之前,需要定义文档中要存放数据的字段。与许多其他ORM类似,我们将通过继承Document类,并提供我们想要的数据类型来做到这一点:
import datetime class Post(Document): title = StringField(required=True, max_length=200) content = StringField(required=True) author = StringField(required=True, max_length=50) published = DateTimeField(default=datetime.datetime.now)在这个简单的模型中,我们已经告诉MongoEngine,我们的Post实例有title、content、author、published。现在Document对象可以使用该信息来验证我们提供它的数据。
因此,如果我们试图保存Post的中没有title那么它会抛出一个Exception,让我们知道。我们甚至可以进一步利用这个并添加更多的限制:
required:设置必须;
default:如果没有其他值给出使用指定的默认值
unique:确保集合中没有其他document有此字段的值相同
choices:确保该字段的值等于数组中的给定值之一
保存文档将文档保存到数据库中,我们将使用save()的方法。如果文档中的数据库已经存在,则所有的更改将在原子水平上对现有的文档进行。如果它不存在,但是,那么它会被创建。
这里是创建和保存一个文档的例子:
post_1 = Post( title='Sample Post', content='Some engaging content', author='Scott' ) post_1.save() # This will perform an insert print(post_1.title) post_1.title = 'A Better Post Title' post_1.save() # This will perform an atomic edit on "title" print(post_1.title)调用save()的时候需要注意几点:
PyMongo将在您调用.save()时执行验证,这意味着它将根据您在类中声明的模式检查要保存的数据,如果违反模式(或约束),则抛出异常并且不保存数据;
由于Mongo不支持真正的事务,因此没有办法像在SQL数据库中那样“回滚”.save()调用。
当你保存的数据没有title时:
post_2 = Post(content='Content goes here', author='Michael') post_2.save() raise ValidationError(message, errors=errors) mongoengine.errors.ValidationError: ValidationError (Post:None) (Field is required: ['title']) 向对象的特性使用MongoEngine是面向对象的,你也可以添加方法到你的子类文档。例如下面的示例,其中函数用于修改默认查询集(返回集合的所有对象)。通过使用它,我们可以对类应用默认过滤器,并只获取所需的对象
class Post(Document): title = StringField() published = BooleanField() @queryset_manager def live_posts(clazz, queryset): return queryset.filter(published=True) 关联其他文档您还可以使用ReferenceField对象来创建从一个文档到另一个文档的引用。MongoEngine在访问时自动惰性处理引用。
class Author(Document): name = StringField() class Post(Document): author = ReferenceField(Author) Post.objects.first().author.name 在上面的代码中,使用文档”外键”,我们可以很容易地找到第一篇文章的作者。其实还有比这里介绍的更多的字段类(和参数),所以一定要查看更多信息。
从所有这些示例中,您应该能够看到,MongoEngine非常适合管理几乎任何类型的应用程序的数据库对象。这些功能使得创建一个高效可扩展程序变得非常容易。如果你正在寻找更多关于MongoEngine的帮助,请务必查阅他们的用户指南。
Ubuntu 14.04安装Python 3.3.5
CentOS上源码安装Python3.4
《Python核心编程 第二版》.(Wesley J. Chun ).[高清PDF中文版]