Getting error "Document has been modified after you have opened it", when self.save used

here is the code, i am using self.save() multiple times.
why i am getting this error.

def after_insert(self):
		membership_log.info(f"After Insert Event - Membership")
		try:
			self.save()
			mobile_number = ''
			if '-' in self.mobile:
				mobile_number = self.mobile.split('-')[1]
			else:
				mobile_number = self.mobile
			insta_registration = True
			try:
				if insta_registration:
					insta_response_data = create_pre_registration(self, membership_log)
					membership_log.info(f"Membership {self.name}, Mobile: {self.mobile}, Pre Registration Output: {insta_response_data}")
					if insta_response_data['status'] == "success":
						self.reload()
						self.mr_number = insta_response_data['response']['patient']
						self.save()
						membership_log.info(f"MR Number Added Successfully for Membership {self.name}, Mobile: {self.mobile}")
					elif insta_response_data['status'] == 'error':
						if insta_response_data['response'].get('return_code') == "1001":
							res = get_mr_no_with_mobile(self, membership_log)
							if res.get("status") == "success":
								mr_no = res.get("mr_no")
								membership_log.info(f"Updating MR No: {mr_no} for Membership Record:{self.name} and Mobile: {self.mobile}")
								self.mr_number = mr_no
								self.save()
								frappe.msgprint(f"Please Note Your Card ID: {self.card_id} and Medical Record Number: {self.mr_number}")
						else:
							membership_log.error(f"Membership {self.name}, Mobile: {self.mobile}, Pre-Registration Failed")
							frappe.msgprint(f"Please Note Your Card ID: {self.card_id} for future reference")
					else:
						membership_log.error(f"Membership {self.name}, Mobile: {self.mobile}, Pre-Registration Failed")
						frappe.msgprint(f"Please Note Your Card ID: {self.card_id} for future reference")
			except Exception as e:
				membership_log.error(f"Error in pre-reg for Membership record: {self.name}, Mobile: {self.mobile}, Error: {e}")
			finally:
				## Generating Membership Card PDF	
				try:
					# Generate PDF and save to File Doctype
					card_gen_res = self.generate_membership_card_pdf(membership_log)
					if card_gen_res['status'] == 'success':
						pdf_url = card_gen_res['file_url']
						## Sending Registration Whatsapp Message
						wati_res = self.send_msg(pdf_url, membership_log)
						if wati_res['status'] == "success":
							self.reload()
							self.reg_sms = 1
							self.save()
							membership_log.info(f"Registration whatsapp msg Membership {self.name}, Mobile: {self.mobile}. Reg SMS field Checked in Membership")
						else:
							membership_log.error(f"Error in sending Registration SMS for record: {self.name}, Mobile: {self.mobile}")
				except Exception as e:
					membership_log.error(frappe.get_traceback(), "PDF Generation Failed")
		except Exception as e:
			membership_log.error(f"Membership ip - {self.membership_type}:
			    {e}")

because of that you get error.
try it once at last.

hey @Owaishk08 need some clarification in your answer
because of what, i got error?
what should i try?

after saving the changes

commit the changes and reload the document

so after self.save() i need to do frappe.db.commit() and self.reload().
am i right? @kareemsk

Why are you using save in after_insert?

You are making unnecessary DB calls.

If you want to use anyway, use

self.db_set()

And you are getting this error because same object (instance) is getting modified after save in after_insert.

Although this method can be used, updating the value directly in the database will not trigger Frappe events.(eg. on_update,before_save etc)

Yes you are right. But looking at the implementation I don’t think doc events require here. And if doc events require then can change some implementation

ok @Abdeali
does self.db_set() not make any api calls?
in after insert, mostly i am just updating the fields. so its better to use db_set().

self.db_set()

it is like frappe.db.set_value()

will not trigger any doc events.

You can update single or multiple fields at a time