Назначение поля ссылки

У меня есть модель:

from flask.ext.security import currennt_user
#instance of LocalProxy wrapped model User(db.Document)

class ContactModel(db.Document, SomeMixin):
    user = db.ReferenceField(User, verbose_name='User', required=True)

И столкнулся со странным поведением ReferenceField. Почему работает следующий код:

model = ContactModel(user = current_user.pk, ....)

И не следует:

model = ContactModel()
model.user = current_user.pk

Та же проблема, когда я пытаюсь сделать: model = ContactModel() model.user = current_user

Последние две части кода вызывают ошибку: ValidationError: ValidationError (ContactModel:None) (A ReferenceField only accepts DBRef or documents: ['user'])


person Alex G.P.    schedule 13.09.2013    source источник


Ответы (1)


current_user.pk имеет тип ObjectId (просто id, без информации о коллекции).

current_user имеет тип LocalProxy.

Вы не можете сохранить ссылку как ObjectId, потому что нет информации о коллекции ссылок и использовании монго для этого BDRef.

Вы можете получить объект DBRef из документа mongoengine с помощью метода Document.to_dbref.

Таким образом, можно проверить тип, чтобы получить DBRef явно или получить его из документа с to_dbref.

Для current_user вы можете вызвать to_dbref, чтобы получить объект DBRef, или _get_current_object(), чтобы получить реальный объект User.

person tbicr    schedule 15.09.2013