我有一个基类Feed
,从中RSS
和Channels
继承。定义如下:
class Feed(Document):
meta_info = EmbeddedDocument(MetaInfo, default=MetaInfo, required=True)
name = StringField()
link = StringField()
meta = {'allow_inheritance': True}
我希望我的另外两个类RSS
和Channels
能够继承Feed
文档及其嵌入的文档MetaInfo
。但是,当运行整个文件时,将显示以下代码:
class Channel(Feed):
channel_id = IntField(primary_key=True, unique=True, required=True)
update_interval = IntField(default=300, required=True)
# similar class for RSS but with different fields
我得到以下错误:
File "/Users/komron/dev/github/courant/src/models/channels.py", line 9, in <module>
class Channel(Feed):
File "/Users/komron/.local/share/virtualenvs/courant-Dv7-v42z/lib/python3.7/sitepackages/mongoengine/base/metaclasses.py", line 407, in __new__
raise ValueError("Cannot override primary key field")
ValueError: Cannot override primary key field
我做错了什么?MongoEngine的继承是否有我应该注意的限制?谢谢
由于使用继承,所以
Feed
、RSS
和Channels
类的文档都将位于同一个集合中(默认情况下命名为feed
)。问题是在一个集合中不能有多个主键,您的子类需要共享定义为主键的同一字段,并且应该在父Feed
类中定义该字段请注意,如果不指定任何内容(如在
Feed
类中),MongoEngine会在幕后隐式使用id=ObjectIdField(primary_key=True, default=bson.ObjectId)
。这解释了为什么会出现与覆盖它相关的错误这个与主键相关的SO post可能也很有趣
相关问题 更多 >
编程相关推荐