【问题标题】:Save reference field mongoengine保存参考字段 mongoengine
【发布时间】:2016-10-31 05:58:21
【问题描述】:

简化,我有 2 个 Document 对象:ResourceCable

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

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

这两个文档都已经在数据库中了,但是资源中的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)(A ReferenceField 只接受 DBRef 或文档:['cable'])

我不明白,因为实际上我是在传递文档本身

【问题讨论】:

    标签: python mongodb flask mongoengine


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多