def copy_foreign_keys(self, event):
        """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
        """
        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)
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