ValueError:无法覆盖主键字段

2024-09-27 00:18:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个基类Feed,从中RSSChannels继承。定义如下:

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

    meta = {'allow_inheritance': True}

我希望我的另外两个类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的继承是否有我应该注意的限制?谢谢


Tags: key文档truedefaultfeedchannelrequiredmeta
1条回答
网友
1楼 · 发布于 2024-09-27 00:18:39

由于使用继承,所以FeedRSSChannels类的文档都将位于同一个集合中(默认情况下命名为feed)。问题是在一个集合中不能有多个主键,您的子类需要共享定义为主键的同一字段,并且应该在父Feed类中定义该字段

请注意,如果不指定任何内容(如在Feed类中),MongoEngine会在幕后隐式使用id=ObjectIdField(primary_key=True, default=bson.ObjectId)。这解释了为什么会出现与覆盖它相关的错误

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

相关问题 更多 >

    热门问题