ValueError: Невозможно переопределить поле первичного ключа - PullRequest
0 голосов
/ 12 января 2020

У меня есть базовый класс документов 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, о которых я должен знать? Спасибо.

1 Ответ

1 голос
/ 12 января 2020

Поскольку вы используете наследование, документы классов Feed, RSS и Channels будут находиться в одной коллекции (по умолчанию feed). Проблема в том, что вы не можете иметь несколько первичных ключей в одной коллекции, ваши подклассы должны совместно использовать одно и то же поле, которое определено как первичный ключ, и оно должно быть определено в родительском Feed классе.

Примечание что когда вы ничего не указываете (как в вашем Feed классе), MongoEngine неявно использует id=ObjectIdField(primary_key=True, default=bson.ObjectId) за кулисами. Это объясняет, почему вы получаете ошибку, связанную с переопределением.

Эта SO запись , связанная с первичным ключом, также может представлять интерес

...