В случае, если кто-то еще попадет на эту страницу, вот как мне удалось это сделать ... моя интерпретация вопроса заключается в том, как выполнить действия с триггерными функциями базы данных на конце базы данных.Моя база данных - PostgreSQL, но SQL является стандартом, запросы для MySQL и других должны быть примерно одинаковыми).
Решение относительно простое.Как только вы выполните свой первый
python manage.py makemigrations
python manage.py migrate
, перейдите к выбранному вами менеджеру базы данных и найдите SQL-запрос, сгенерировавший таблицу, для которой вы хотите иметь свой триггер.
Например,Ваш запрос на создание таблицы public.auth.users
может выглядеть следующим образом:
CREATE TABLE public.auth_user
(
id integer NOT NULL DEFAULT nextval('auth_user_id_seq'::regclass),
password character varying(128) COLLATE pg_catalog."default" NOT NULL,
last_login timestamp with time zone,
is_superuser boolean NOT NULL,
username character varying(150) COLLATE pg_catalog."default" NOT NULL,
first_name character varying(30) COLLATE pg_catalog."default" NOT NULL,
last_name character varying(150) COLLATE pg_catalog."default" NOT NULL,
email character varying(254) COLLATE pg_catalog."default" NOT NULL,
is_staff boolean NOT NULL,
is_active boolean NOT NULL,
date_joined timestamp with time zone NOT NULL,
CONSTRAINT auth_user_pkey PRIMARY KEY (id),
CONSTRAINT auth_user_username_key UNIQUE (username)
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;
Допустим, вы хотите иметь триггер для изменения last_name каждой новой записи на значение "Trump" (без кавычек).Код для создания вашей триггерной функции будет выглядеть следующим образом (примечание: строки RAISE NOTICE
просто выводят информацию в терминал SQL для отладки. Вы можете закомментировать их, добавив перед ними двойную черту, например --RAISE NOTICE 'id = % ', NEW.id;
):
CREATE OR REPLACE FUNCTION trumpisizer() RETURNS trigger AS $$
BEGIN
RAISE NOTICE 'last_name = % ', NEW.last_name;
NEW.last_name = 'Trump';
RAISE NOTICE 'last_name = % ', NEW.last_name;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Теперь вам нужно привязать свою функцию к вашему столу.Этот запрос SQL для этого:
CREATE TRIGGER trumpist BEFORE INSERT ON auth_user FOR EACH ROW EXECUTE PROCEDURE trumpisizer();
Теперь загрузите ваше приложение django и создайте нового пользователя.Фамилия каждого нового пользователя будет изменена на новое значение.