InvalidDocument: невозможно закодировать объект: ‹User: User object› ReferenceField с MongoEngine

Я работал с Flask и MongoEngine, и у меня возникли проблемы при попытке сохранить объект из-за ReferenceField.

Вот так выглядит моя модель:

class User(UserMixin, db.Document):
    first_name = db.StringField(max_length=255, required=True)
    last_name = db.StringField(max_length=255, required=True)
    email = db.StringField(max_length=255)

class Post(db.Document):
    description = db.StringField(max_length=255, required=True)
    inserted_at = db.DateTimeField(default=datetime.datetime.now, required=True)
    tags = db.ListField(db.EmbeddedDocumentField('Tag'))
    comments = db.ListField(db.EmbeddedDocumentField('Comment'))
    user = db.ReferenceField('User')

Вот как я создаю объект Post:

    user = User.objects.filter(id=current_user.id).first()

    post = Post(
        description = request.json["description"],
        user = user
    )

Я также пробовал:

user = current_user._get_current_object()

Но я продолжаю получать:

InvalidDocument: Cannot encode object: <User: User object>

Любые идеи о том, что происходит?

Спасибо!


person Larissa Leite    schedule 23.09.2015    source источник


Ответы (2)


Я думаю, что есть проблема с модулем db, который вы используете. Это действительно модуль mongoengine. Поскольку ваш код работает нормально, если я использую

import mongoengine as db
person hspandher    schedule 23.09.2015
comment
db создается следующим образом: app.config.from_object('config') db = MongoEngine(app).. понятия не имею, что может быть не так с этим модулем :( - person Larissa Leite; 23.09.2015
comment
На самом деле я не тестировал его во фляге, но он отлично работает в приложении django с mongoengine. - person hspandher; 23.09.2015
comment
Я удалил все бд. в моих моделях (я добавил из mongoenine import *), но все равно получаю то же самое.. - person Larissa Leite; 23.09.2015

Ну, это из давно, но у меня такая же проблема. Я не знаю, если это по другим причинам, но контекст действительно выглядит очень похожим.

В любом случае, похоже, что объект current_user является экземпляром LocalProxy, который плохо работает с mongoengine. Хитрость заключалась в том, чтобы «принудительно» разыменовать ObjectID экземпляра, например:

post = Post(
        description = request.json["description"],
        user = user.id
    )
person Hadrien Titeux    schedule 03.12.2018