Сохранить контрольное поле 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