code: def copy_foreign_keys(self, event):
          
          event_keys = set(event._meta.fields.keys())
          obj_keys = self._meta.fields.keys()
          matching_keys = event_keys.intersection(obj_keys)
  
          for key in matching_keys:
              # Skip created_by because that will always be the current_user
              # for the Event.
              if key == 'created_by':
                  continue
  
              # Skip anything that isn't a FK
              if not isinstance(self._meta.fields[key], peewee.ForeignKeyField):
                  continue
  
              setattr(event, key, getattr(self, key))
  
          # Attempt to set the obj's ID in the correct FK field on Event, if it
          # exists. If this conflicts with desired behavior, handle this in the
          # respective callback. This does rely on the FK matching the lower case
          # version of the class name and that the event isn't trying to delete
          # the current record, becuase that ends badly.
          possible_key = self.__class__.__name__.lower()
  
          if possible_key in event_keys and event.code != 'AUDIT_DELETE':
              setattr(event, possible_key, self)
docs: Copies possible foreign key values from the object into the Event,
          skipping common keys like modified and created.
  
          Args:
              event (Event): The Event instance to copy the FKs into
              obj (fleaker.db.Model): The object to pull the values from