Сохранить контрольное поле mongoengine

Упрощенно, у меня есть 2 объекта документа: Resource а также Cable

class Cable(db.Document):
    _id = db.ObjectIdField()
    socket = db.EmbeddedDocumentField(Socket)

class Resource(db.Document):
    _id = db.StringField()
    cable = db.ReferenceField('Cable')

Оба документа уже находятся в БД, но поле кабеля в ресурсе установлено на null,

@resources.route('/<r_id>/add_cabling', methods=['GET'])
def set_connector(r_id):
    r = Resource.objects(id=r_id).get()
    c = Cable.objects().first()
    r.cable=c
    r.save()
    return jsonify(r)

Так что я передаю экземпляр документа Cable к примеру Resource а потом save(), Я получаю следующую ошибку:

ValidationError: ValidationError (Resource: res01) (ReferenceField принимает только DBRef или документы: ['cable'])

Я не понимаю, потому что на самом деле я передаю сам документ

1 ответ

Решение

Пробовал с этим обходным путем прохождения DBRef документа, и это работает.

@resources.route('/<r_id>/add_cabling', methods=['GET'])
def set_connector(r_id):
    r = Resource.objects(id=r_id).get()
    c = Cable.objects().first()
    c.save() #revalidate here
    r.cable=c.to_dbref()
    r.save()
    return jsonify(r)

Необходимо выполнить save() снова операция на запрашиваемом объекте, чтобы получить DBRef в противном случае он выдаст эту ошибку:

OperationError: только сохраненные документы могут иметь действительный dbref

Другие вопросы по тегам