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