官方文档地址:http://docs.mongoengine.org/django.html
博客地址:http://blog.csdn.net/gugugujiawei
6、Django支持
注意:
Mongoengine已更新到支持Django1.5
6.1 连接
在setting.py文件中,忽略标准的设置,即缺省的设置(除非你想在你的工程中利用ORM模式),同时在某处module调用connect()函数。
注意:
如果你并不正在利用另一个数据库后台,你可能需要添加一个虚拟数据库后台到setting.py文件中,譬如:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.dummy' }}
6.2 认证
Mongoengine包含了一个利用mongodb的Django认证后台。User model是一个mongoengine Document,但实现了几乎所有标准Django User model的方法和属性——所以两者是相对兼容的。利用这个后台系统能让你以mongodb的形式存储User但仍然利用很多Django自己的认证架构(例如login_required()修饰器以及authenticate()方法)。为了能利用到mongodb的认证后台,需添加以下代码到setting.py文件中:
AUTHENTICATION_BACKENDS = ( 'mongoengine.django.auth.MongoEngineBackend',)
利用auth 模块能包含get_user()方法,从而通过user的键返回对应的user对象
更新的用法见版本0.1.3
6.3 定制的User model
Django 1.5引进了定制的user models,该model能被作为mongoengine认证后台的替代物。
改设置的主要优点是其他依赖django.contrib.auth的成分和支持新的可交换user model的成分能运用得更好。例如,你能利用cretesuperuser管理命令。
Setting.py设置如下
INSTALLED_APPS = (
...
'django.contrib.auth',
'mongoengine.django.mongo_auth',
...
)
AUTH_USER_MODEL = 'mongo_auth.MongoUser'
一个额外的MONGOENGINE_USER_DOCUMENT设置能让你改变User类为其他你选择的类
MONGOENGINE_USER_DOCUMENT = 'mongoengine.django.auth.User'
6.4 缓存
Django允许不同后台存储系统的缓存利用。Mongoengine提供了一个基于mongodb的缓存后台给Django,该后台允许你利用缓存到你的Django应用中,但仅限于mongodb。为了使mongoengine缓存后台生效,确保你的module设置中有'django.contrib.sessions.middleware.SessionMiddleware'(在MIDDLEWARE_CLASSES),并且有'django.contrib.sessions' (在INSTALLED_APPS). 并且,在settings.py中添加
SESSION_ENGINE = 'mongoengine.django.sessions'
SESSION_SERIALIZER = 'mongoengine.django.sessions.BSONSerializer'
Django提供缓存cookie,能在SESSION_COOKIE_AGE秒内有效,但不能通过缓存后台删除cookie,因此'mongoengine.django.sessions'支持 mongodb TTL
注意:
SESSION_SERIALIZER只是对于Django1.6是必须的,因为其缺省设置时基于JSON并且不知道怎样转换bson.objectid.ObjectId实例到strings。
更加新方法见版本0.2.1
6.5 存储
由于通过FileField mongoEngine能提供对GridFS的支持,因此利用Django文件存储后台来包装GridFS是十分有用的。这个新的存储模块被称为GridFSStorage。利用它的方法非常类似于缺省的FileSystemStorage。
from mongoengine.django.storage
import GridFSStoragefs = GridFSStorage()filename = fs.save('hello.txt', 'Hello, World!')
除了path()方法,所有的Django存储API方法都被实现了。如果文件名已经存在,下划线和一个数字会被加到文件名上,直到文件名不存在为止。save()函数能返回新的文件名:
>>> fs.exists('hello.txt')
True
>>> fs.open('hello.txt').read()
'Hello, World!'
>>> fs.size('hello.txt')
13
>>> fs.url('hello.txt')
'http://your_media_url/hello.txt'
>>> fs.open('hello.txt').name
'hello.txt'
>>> fs.listdir()
([], [u'hello.txt'])
所有文件会被存起来和在GridFS通过FileDocument被重新获取。当然,也有一种简单的方法访问这些文件,而无需通过GridFS存储后台:
>>> from mongoengine.django.storage import FileDocument
>>> FileDocument.objects()
[<FileDocument: FileDocument object>]
更新的内容见版本0.4
6.6 快捷手段
受Django shortcut get_object_or_404的启发,get_document_or_404()方法返回一个document或者当document不存在的时候,触发一个Http404的错误。
from mongoengine.django.shortcuts import get_document_or_404
admin_user = get_document_or_404(User, username='root')
第一个参数为一个Document或者QuerySet对象。所有其它通过的参数和关键词参数在query中被用到:
foo_email = get_document_or_404(User.objects.only('email'), username='foo', is_active=True).email
注意:
与get()相似,如果多个对象匹配被找到,多对象返回会抛出错误。
当然也受Django shortcut get_object_or_404的启发,get_list_or_404()方法返回一个包含documents的列表,或者当列表为空时,触发一个Http404的错误:
from mongoengine.django.shortcuts import get_list_or_404
active_users = get_list_or_404(User, is_active=True)
第一个参数为Document或者QuerySet对象。所有其它通过的参数和关键词参数被用在过滤查找。