2012-12-11 40 views
4

爲什麼mongoengine將_types_cls字段添加到集合的每個文檔。
它們都是(鍵,值)對,它們都包含文檔模型類的名稱。唯一的區別是_types值是一個列表,我假設它可以有多個模型類名稱,如果涉及一些繼承。MongoEngine _types和_cls字段

但問題是:爲什麼我需要它們存在於集合中的每個文檔中,當所有文檔的兩個字段都具有相同的值時?

回答

9

Mongoengine允許文檔繼承。在定義類時,使用元屬性allow_inheritance來允許對這個特定類進行子類化。 _cls_types字段用於標識對象屬於哪個類。

考慮一個文件名爲User用於存儲用戶的信息:

class User(Document): 
    meta = {'allow_inheritance': True} 
    # stores information regarding a user 

現在考慮一個文件名爲StackOverFlowUser:這個文件是從User文檔中繼承並節省了用戶的一些StackOverflow的相關信息:

class StackOverFlowUser(User): 
    # stores StackOverflow information of a user 

對於這兩個文檔類,mongoengine將使用相同的集合user。無論您創建哪個文檔對象,它都將作爲文檔存儲在此集合中。

要區分對象所屬的類別,將使用_cls_types字段。

對於User對象:

{ 
    ... 
    '_cls' = 'User', 
    '_types' = ['User', 'User.StackOverFlowUser'] 
} 

對於StackOverFlowUser對象:

{ 
    ... 
    '_cls' = 'User.StackOverFlowUser', 
    '_types' = ['User', 'User.StackOverFlowUser'] 
} 

如果您確信文檔不會有一個子類的文檔,然後設置allow_inheritanceFalse和mongoengine將不會爲該文檔保存_cls_types字段。

+5

請注意,_types將在0.8 – Ross

相關問題