如何继承查询MongoEngine文档?

问题描述 投票:0回答:2

我使用

Node
MongoEngine 文档已经有一段时间了。

我正在尝试从一个简单的

Node
模型转变为继承它的一些更具体的元素。

到目前为止我做了什么

起初,我不知道 MongoEngine 提供的继承可能性(参见此处),因此我使用“标签”字段来区分 3 种类型的节点(分别是关键字、Url 和域)。

这是原始模型:

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
    迁移到
    Url
    Domain
    label
    吗?

谢谢!

python mongodb python-3.x inheritance mongoengine
2个回答
4
投票

发生这种情况是因为当您创建继承模型时,旧模型查询使用

_cls
属性来查询该模型的记录。但旧记录没有这个字段。

将此属性填写到旧记录中。

至于你的第二个问题。

我认为,如果您要制作一个将填充

_cls
字段的迁移脚本,您可以根据
label
字段的值填充其值。

您可以找到所需的

_cls
值插入每个模型的记录。


0
投票

我在使用 DynamicDocuments 时遇到了一些相关问题。

子类中的文档仍然带有父类的 _cls 属性。我想我只会在创建时手动更新它。

© www.soinside.com 2019 - 2024. All rights reserved.