It's better to create a new field for the custom id in the models and the process in the backend. You can set that as primary_key with unique=True and editable=False:
class Custom(models.Model):
  id = models.Autofield(primary_key=True, editable=False, max_length=10)
  uid= models.CharField(max_length=100, unique=True)
  def save(self, *args, **kwargs):
    super().save(*args, **kwargs)
    self.set_uid()                                 # calling the set_uid function
  def set_uid(self):
    if not self.uid:                               # if uid of the instance is blank
      uid = "CUS" + str(self.id + (10 ** 5))       # generating the uid
      customer= Custom.objects.get(id=self.id)     # getting the instance
      customer.uid = uid                           # allocating the value
      customer.save()                              # saving the instance
  def __str__(self):
    return self.uid
Can also merge the set_uid() inside the save() where the function is called:
class Custom(models.Model):
  id = models.Autofield(primary_key=True, editable=False, max_length=10)
  uid= models.CharField(max_length=100, unique=True)
  def save(self, *args, **kwargs):
    super().save(*args, **kwargs)
    if not self.uid:                                # if uid of the instance is blank
      self.uid = "CUS" + str(self.id + (10 ** 5))   # generating the uid and allocating the value
      self.save()                                   # saving the instance
  
  def __str__(self):
    return self.uid