ValueError: Cannot override primary key field
ValueError: Cannot override primary key field
我有一个基础文档 class Feed
,RSS
和 Channels
从中继承。这是定义:
class Feed(Document):
meta_info = EmbeddedDocument(MetaInfo, default=MetaInfo, required=True)
name = StringField()
link = StringField()
meta = {'allow_inheritance': True}
我希望我的另外两个 classes,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
classes 的文档将存在于同一个集合中(命名为 feed
默认)。问题是你不能在 1 个集合中有多个主键,你的子 classes 需要共享定义为主键的同一个字段,它应该在父 Feed
class.
请注意,当您未指定任何内容时(例如在 Feed
class 中),MongoEngine 会在幕后隐式使用 id=ObjectIdField(primary_key=True, default=bson.ObjectId)
。这解释了为什么您会收到与覆盖它相关的错误。
这个与主键相关的 SO post 可能也很有趣
我有一个基础文档 class Feed
,RSS
和 Channels
从中继承。这是定义:
class Feed(Document):
meta_info = EmbeddedDocument(MetaInfo, default=MetaInfo, required=True)
name = StringField()
link = StringField()
meta = {'allow_inheritance': True}
我希望我的另外两个 classes,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
classes 的文档将存在于同一个集合中(命名为 feed
默认)。问题是你不能在 1 个集合中有多个主键,你的子 classes 需要共享定义为主键的同一个字段,它应该在父 Feed
class.
请注意,当您未指定任何内容时(例如在 Feed
class 中),MongoEngine 会在幕后隐式使用 id=ObjectIdField(primary_key=True, default=bson.ObjectId)
。这解释了为什么您会收到与覆盖它相关的错误。
这个与主键相关的 SO post 可能也很有趣