old_contents: 
  from django.db import connection
  from south.db import generic
  
  class DatabaseOperations(generic.DatabaseOperations):
  
      """
      PsycoPG2 implementation of database operations.
      """
  
      def rename_column(self, table_name, old, new):
          if old == new:
              return []
          qn = connection.ops.quote_name
          params = (qn(table_name), qn(old), qn(new))
          self.execute('ALTER TABLE %s RENAME COLUMN %s TO %s;' % params)
      
      def rename_table(self, old_table_name, table_name):
          # First, rename the table
          generic.DatabaseOperations.rename_table(self, old_table_name, table_name)
          # Then, try renaming the ID sequence
          # (if you're using other AutoFields... your problem, unfortunately)
          self.commit_transaction()
          self.start_transaction()
          try:
              generic.DatabaseOperations.rename_table(self, old_table_name+"_id_seq", table_name+"_id_seq")
          except:
              print "   ~ No such sequence (ignoring error)"
              self.rollback_transaction()
          else:
              self.commit_transaction()
          self.start_transaction()
new_contents: 
  from django.db import connection
  from south.db import generic
  
  class DatabaseOperations(generic.DatabaseOperations):
  
      """
      PsycoPG2 implementation of database operations.
      """
  
      def rename_column(self, table_name, old, new):
          if old == new:
              return []
          qn = connection.ops.quote_name
          params = (qn(table_name), qn(old), qn(new))
          self.execute('ALTER TABLE %s RENAME COLUMN %s TO %s;' % params)
      
      def rename_table(self, old_table_name, table_name):
          "will rename the table and an associated ID sequence and primary key index"
          # First, rename the table
          generic.DatabaseOperations.rename_table(self, old_table_name, table_name)
          # Then, try renaming the ID sequence
          # (if you're using other AutoFields... your problem, unfortunately)
          self.commit_transaction()
          self.start_transaction()
          try:
              generic.DatabaseOperations.rename_table(self, old_table_name+"_id_seq", table_name+"_id_seq")
          except:
              if self.debug:
                  print "   ~ No such sequence (ignoring error)"
              self.rollback_transaction()
          else:
              self.commit_transaction()
          self.start_transaction()
  
          # Rename primary key index, will not rename other indices on
          # the table that are used by django (e.g. foreign keys). Until
          # figure out how, you need to do this yourself.
          try:
              generic.DatabaseOperations.rename_table(self, old_table_name+"_pkey", table_name+ "_pkey")
          except:
              if self.debug:
                  print "   ~ No such primary key (ignoring error)"
              self.rollback_transaction()
          else:
              self.commit_transaction()
          self.start_transaction()
  
  
      def rename_index(self, old_index_name, index_name):
          "Rename an index individually"
          generic.DatabaseOperations.rename_table(self, old_index_name, index_name)
  
subject: Rename primary key index with table