refactor: use `get_product_bundle_list()` to get all product bundle at once
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py
index 2a3f9fc..ce33d26 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.py
@@ -308,11 +308,19 @@
 	def validate_packed_qty(self):
 		"""Validate that if packed qty exists, it should be equal to qty"""
 
-		for item in self.items + self.packed_items:
-			if item.packed_qty and item.packed_qty != item.qty:
-				frappe.throw(
-					_("Row {0}: Packed Qty must be equal to {1} Qty.").format(item.idx, frappe.bold(item.doctype))
-				)
+		if frappe.db.exists("Packing Slip", {"docstatus": 1, "delivery_note": self.name}):
+			product_bundle_list = self.get_product_bundle_list()
+			for item in self.items + self.packed_items:
+				if (
+					item.item_code not in product_bundle_list
+					and flt(item.packed_qty)
+					and flt(item.packed_qty) != flt(item.qty)
+				):
+					frappe.throw(
+						_("Row {0}: Packed Qty must be equal to {1} Qty.").format(
+							item.idx, frappe.bold(item.doctype)
+						)
+					)
 
 	def update_pick_list_status(self):
 		from erpnext.stock.doctype.pick_list.pick_list import update_pick_list_status
@@ -391,19 +399,22 @@
 			)
 
 	def has_unpacked_items(self):
-		for item in self.items:
-			if (
-				not frappe.db.exists("Product Bundle", {"new_item_code": item.item_code})
-				and item.packed_qty < item.qty
-			):
-				return True
+		product_bundle_list = self.get_product_bundle_list()
 
-		for item in self.packed_items:
-			if item.packed_qty < item.qty:
+		for item in self.items + self.packed_items:
+			if item.item_code not in product_bundle_list and flt(item.packed_qty) < flt(item.qty):
 				return True
 
 		return False
 
+	def get_product_bundle_list(self):
+		items_list = [item.item_code for item in self.items]
+		return frappe.db.get_all(
+			"Product Bundle",
+			filters={"new_item_code": ["in", items_list]},
+			pluck="name",
+		)
+
 
 def update_billed_amount_based_on_so(so_detail, update_modified=True):
 	from frappe.query_builder.functions import Sum
@@ -724,7 +735,7 @@
 				"postprocess": update_item,
 				"condition": lambda item: (
 					not frappe.db.exists("Product Bundle", {"new_item_code": item.item_code})
-					and item.packed_qty < item.qty
+					and flt(item.packed_qty) < flt(item.qty)
 				),
 			},
 			"Packed Item": {
@@ -738,7 +749,7 @@
 					"name": "pi_detail",
 				},
 				"postprocess": update_item,
-				"condition": lambda item: (item.packed_qty < item.qty),
+				"condition": lambda item: (flt(item.packed_qty) < flt(item.qty)),
 			},
 		},
 		target_doc,