MongoEngine _types и _cls полета

Защо mongoengine добавя полета _types и _cls към всеки документ от колекция.
И двете са двойка (ключ, стойност) и двете съдържат името от моделния клас на документа. Единствената разлика е, че стойността на _types е списък и предполагам, че може да има множество имена на класове на модели, ако има някакво наследяване.

Въпросът обаче е: защо ми е необходимо те да съществуват във всеки документ в колекция, когато всички документи ще имат еднакви стойности и за двете полета?


person Traian    schedule 11.12.2012    source източник


Отговори (1)


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_inheritance на False и mongoengine няма да запази _cls и _types полета за този документ.

person Crazyshezy    schedule 14.12.2012
comment
Моля, обърнете внимание, че _types ще се появи в 0.8 - person Ross; 18.12.2012