【问题标题】:Mongoengine ValidationError You can only reference documents once they have been saved to the databaseMongoengine ValidationError 您只能在将文档保存到数据库后才能引用它们
【发布时间】:2021-04-03 08:43:53
【问题描述】:

总结:(Python+Flask+MongoDB)定义了两个模型 - UserPostPost 引用 User。尝试通过引用已保存的 User 创建 Post 但出现 You can only reference documents once they have been saved to the database 错误。

详情
你好!我正在关注 python(已安装 v3.7)、flask(已安装 v1.1.2)、MongoDB(已安装 mongoengine v0.23.0)编写一个简单的博客应用程序的教程。
我有一个User 模型和一个Post 模型。 User 可以注册、登录和写帖子。我能够创建和保存用户。但是,当我尝试通过引用(以前创建和保存的)User 创建Post 时,我得到 Mongoengine ValidationError You can only reference documents once they have been saved to the database

Post 对象中引用的 User 对象存在于数据库中 - 通过 Mongo shell 确认。

任何指针/帮助/输入将不胜感激。我是 MongoDB 新手。

代码

# models.py 
from flask_mongoengine import MongoEngine 

db = MongoEngine()

class User(db.Document):
    _id = db.ObjectIdField()
    username = db.StringField(required = True)
    email = db.EmailField(required = True)

class Post(db.Document):
    _id = db.ObjectIdField()
    created_by = db.ReferenceField(User)
    title = db.StringField(required = True)
    body = db.StringField(required = True)

# blog.py 
""" Module that creates blog posts 
from app.models import User, Post

def create():
    if request.method == 'POST':

        title = request.form['title']
        body = request.form['body']
        
        user = User.objects.get(_id=g.user['_id']) 
        # check user fetched by printing object id 
        # user[_id] matches the User ObjectID obtained via the mongo shell
        print('user id = ' + str(user['_id'])) 

        post = Post(title=title, body=body)
        post.created_by = user
        post.save() # --> this line generates the error 
        return redirect(url_for('blog.index')) 

    return render_template('blog/create.html')

错误 验证中的文件“/Users//.pyenv/versions/3.7.3/lib/python3.7/site-packages/mongoengine/base/document.py”,第 433 行 引发验证错误(消息,错误=错误) mongoengine.errors.ValidationError: ValidationError (Post:None) (您只能在将文档保存到数据库后引用它们:['created_by'])

【问题讨论】:

    标签: python mongodb mongoengine


    【解决方案1】:

    基于this Stackoverflow 问题,我可以通过保存User 然后将用户的DBRef 传递给Post 来完成这项工作。

    user = User.objects.get(_id=g.user['_id'])
    user.save()
    post = Post(title=title, body=body) 
    post.created_by = user.to_dbref()
    post.save()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      相关资源
      最近更新 更多