官方文檔地址: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對象。所有其它通過的參數和關鍵詞參數被用在過濾查找。