【问题标题】:MongoEngine _types and _cls fieldsMongoEngine _types 和 _cls 字段
【发布时间】:2012-12-11 16:41:17
【问题描述】:

为什么 mongoengine 会在集合的每个文档中添加 _types_cls 字段。
它们都是(键,值)对,并且都包含文档模型类的名称。唯一的区别是 _types 值是一个列表,如果涉及到一些继承,我假设它可以有多个模型类名称。

但是问题是:为什么我需要它们存在于集合中的每个文档中,而所有文档的两个字段都具有相同的值?

【问题讨论】:

    标签: django mongoengine


    【解决方案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 字段。

    【讨论】:

    • 请注意 _types 将在 0.8 中使用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2014-02-03
    • 2016-10-31
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多