python - 如何继承查询MongoEngine文档?

标签 python mongodb python-3.x inheritance mongoengine

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

我正在尝试从简单的 Node 模型转向继承它的一些更具体的元素。

到目前为止我做了什么

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

这是原始模型:

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>]
  • 如何访问引入继承之前添加的所有节点?
  • 有没有办法将这些旧的节点迁移到关键字网址基于其原始的 label 属性?

谢谢!

最佳答案

发生这种情况是因为当您创建继承模型时,旧模型查询使用 _cls属性来查询该模型的文档。但旧文档没有这个字段。

旧文档请填写此属性。

关于你的第二个问题。

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

您可以找到为每个模型插入文档所需的 _cls 值。

关于python - 如何继承查询MongoEngine文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33122487/

相关文章:

javascript - 在 html 中加载 .js 文件

python - SQLite3executemany()在多个表上插入的生成器的高效设计

python - 使用 opencv_traincascade 创建 haar 分类器

mongodb - Mongo Cluster 所需的最小配置服务器数量

python - Pygame 类型错误 : missing 1 required positional argument:

python - 流图 - Python 中的可视化

node.js - 如何修改 Mongoose 查询的输出?

javascript - 如何将 MongoDB 查询捕获为字符串并将其显示在我的 Node JS 页面中(使用 mongojs 驱动程序)?

python-3.x - 强制sock.accept()引发测试异常

带有 if 语句的 python exec()