如何用继承查询MongoEngine文档?

时间:2015-10-14 10:08:25

标签: python mongodb python-3.x inheritance mongoengine

我一直在使用Node MongoEngine文档。

我正试图从一个简单的Node模型转到一些继承自它的更具体的元素。

到目前为止我做了什么

起初,我并不知道MongoEngine(see here)提供的继承可能性,所以我使用了一个标签'字段区分3种类型的节点(分别为Keyword,Url和Domain)。

这是原始模型:

class Node(Document):
    project = ReferenceField(Project,
                             reverse_delete_rule=CASCADE,
                             required=True,)
    name = StringField(required=True, unique_with=['project', 'label'])
    label = StringField(required=True)
    volume = IntField()
    clusters = ListField(ReferenceField(Cluster, reverse_delete_rule=PULL))
    x = FloatField(default=random.random())
    y = FloatField(default=random.random())
    connections = IntField(default=0)
    meta = {
        'indexes': ['project', 'label', 'name', 'clusters'],
    }

我使用此模型工作了一段时间,因此node集合当前填充了数千个文档。

然后我通过将'allow_inheritance': True添加到模型并创建以下模型来实现继承:

继承模型

class Keyword(Node):
    """ A MongoEngine Document for keyword management. """
    a_keywor_specific field = IntField()

    def foo(self):
        print('this is a keyword specific method')

现在,这适用于创建和保存新的关键字文档。

我遇到问题的是查询在此更改之前添加的旧节点

问题

如果我尝试查询所有现有节点,则只返回继承更改后添加的节点:

In [21]: Node.objects()
Out[21]: [<Keyword: Keyword object>]
  • 如何在引入继承之前访问添加的所有节点?
  • 有没有办法根据原来的Node属性将这些旧的Keyword迁移到UrlDomainlabel?< / LI>

谢谢!

1 个答案:

答案 0 :(得分:3)

这是因为当您创建继承的模型时,旧模型查询使用_cls属性来查询此模型的记录。但旧记录没有这个领域。

将此属性填入旧记录。

至于你的第二个问题。

我认为,如果您要制作一个填充_cls字段的迁移脚本,则可以根据label字段的值填写其值。

您可以找到插入每个模型记录所需的_cls值。