如何查询带继承的MongoEngine文档?
How to query MongoEngine documents with inheritance?
我使用 Node
MongoEngine 文档已有一段时间了。
我正在尝试从一个简单的 Node
模型过渡到一些更具体的继承自它的元素。
到目前为止我做了什么
起初,我没有意识到MongoEngine提供的继承可能性(see here),所以我使用了一个'label'字段来区分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>]
- 如何访问在引入继承之前添加的所有节点?
- 有什么方法可以根据它们原来的
label
属性将那些旧的 Node
迁移到 Keyword
、Url
和 Domain
?
谢谢!
发生这种情况是因为当您创建继承模型时,旧模型查询使用 _cls
属性来查询该模型的记录。但是旧记录没有这个字段。
将此属性填入旧记录。
关于你的第二个问题
我认为,如果您要制作一个将填充 _cls
字段的迁移脚本,您可以根据 label
字段的值填充它的值。
您可以找到所需的 _cls
个值插入每个模型的记录。
我使用 Node
MongoEngine 文档已有一段时间了。
我正在尝试从一个简单的 Node
模型过渡到一些更具体的继承自它的元素。
到目前为止我做了什么
起初,我没有意识到MongoEngine提供的继承可能性(see here),所以我使用了一个'label'字段来区分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>]
- 如何访问在引入继承之前添加的所有节点?
- 有什么方法可以根据它们原来的
label
属性将那些旧的Node
迁移到Keyword
、Url
和Domain
?
谢谢!
发生这种情况是因为当您创建继承模型时,旧模型查询使用 _cls
属性来查询该模型的记录。但是旧记录没有这个字段。
将此属性填入旧记录。
关于你的第二个问题
我认为,如果您要制作一个将填充 _cls
字段的迁移脚本,您可以根据 label
字段的值填充它的值。
您可以找到所需的 _cls
个值插入每个模型的记录。