MongoEngine/mongoengine

Getting the following error , ValidationError(message, errors=errors) mongoengine.errors.ValidationError: ValidationError (User:656126eff188fc38533e1a9f) (You can only reference documents once they have been saved to the database: ['partners'])

spectrum705 opened this issue · 2 comments

I am creating a new user and setting other users( from already in mongoDB) as partner, which a reference field of User model itself. I have already saved the newly created user still i am getting this error.
even trying "debref" gives this error "mongoengine.errors.OperationError: Only saved documents can have a valid dbref"
Someone please help. Here's the code

#model.py
class User(db.Document, UserMixin):
    username = db.StringField(required=True, unique=True)
    partners = db.ListField(db.ReferenceField('User'))

    password = db.StringField(required=True)
    mobile = db.StringField()
    myid= db.IntField(db_field='id',unique=True,required=True,default=(random.randint(1,10000)))
    _id = db.StringField()
#routes.py
@app.route('/create', methods=['GET', 'POST'])
def create():
    form = NewUserForm()

    # Populate partner choices from the database
    form.partners.choices = [(user.username, user.username) for user in User.objects()]


    if form.validate_on_submit():
        username = form.username.data
        password = form.password.data
        mobile = form.mobile.data
        
        # Check if the username is already taken
        existing_user = User.objects(username=username).first()
        if existing_user:
            flash('Username is already taken. Please choose a different one.', 'danger')
            return redirect(url_for('create'))

        # Create a new user
        new_user = User(username=username, password=password, mobile=mobile)
        list_of_partners  = form.partners.data
      
        try:
            # Attempt to save the new user first
            new_user.save()

            # Now that the new user is saved, assign partners
            new_user.partners = [User.objects(username=each).first() for each in list_of_partners]
            new_user.save()

            flash('Account created successfully! You can now log in.', 'success')
            return redirect(url_for('login'))

        except ValidationError as e:
            # Handle validation error, for example, flash an error message
            flash(f'Validation error: {str(e)}', 'danger')

    return render_template('create.html', form=form)

issue most likely comes from the fact that you set _id = db.StringField()

When you define a primary key like id = ObjectIdField(primary_key=True, default=bson.ObjectId), mongoengine will internally use it as _id and my guess is that you are interfering with that mecanism

yeah ,
I just wanted my own id field. but mongoDB assignes an _id with with object field by default