ValueError: Cannot override primary key field

ValueError: Cannot override primary key field

我有一个基础文档 class FeedRSSChannels 从中继承。这是定义:

class Feed(Document):
    meta_info = EmbeddedDocument(MetaInfo, default=MetaInfo, required=True)
    name = StringField()
    link = StringField()

    meta = {'allow_inheritance': True}

我希望我的另外两个 classes,RSSChannels,能够继承 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 的继承有什么限制吗?谢谢。

由于您使用继承,FeedRSSChannels classes 的文档将存在于同一个集合中(命名为 feed默认)。问题是你不能在 1 个集合中有多个主键,你的子 classes 需要共享定义为主键的同一个字段,它应该在父 Feed class.

请注意,当您未指定任何内容时(例如在 Feed class 中),MongoEngine 会在幕后隐式使用 id=ObjectIdField(primary_key=True, default=bson.ObjectId)。这解释了为什么您会收到与覆盖它相关的错误。

这个与主键相关的 SO post 可能也很有趣