Я, конечно, не супер специалист в PostgreSQL, но не очень понимаю как можно создать тригер, который будет работать на таблицах, которых еще нет и даже название не известно. Скажи как это делать на SQL - можно подумать как это перенести в миграции.
Создается не триггер, а триггерная функция. Она универсальная. В ней можно узнать, какая таблица вызвала функцию. И работать с этой таблицей.
Подключает таблицу к функции - триггер.
На данный момент я уже сделал, по аналогии по ссылке, что давал выше, первоначальную настройку БД. То есть, триггерные функции создаются, БД готова к работе.
Сейчас, нужно, чтобы создавались триггеры которые подключат новую таблицу-неследницу к функциям. На данный момент подключаю вручную, путем простого выполнения sql команд. Если надо будет для каждой новой таблицы-наследницы создавать руками миграцию, то мне это не нужно (проще выполнить sql скрипт, пример которого в конце листинга, на сервере). Интересно автоматизировать именно в исходном приложении в абстрактных моделях (ну или еще как-то).
Код models.py с асбтракными моделями:
from django.db import models
#from django.contrib.postgres.fields import ArrayField
class TreeSize(models.Model):
table_name = models.CharField(primary_key=True, max_length=100)
number_of_levels = models.IntegerField()
number_of_children = models.IntegerField()
class Meta:
db_table = 'tree_size'
class TreeAbstract(models.Model):
# Количество детей
@property
def count_children(self):
return self.created_children - self.removed_children
# Отображение названия узла в админке
@property
def label_node_tr(self):
return '{0}{1} ({2}) '.format('- ' * self.lvl,
self.label_node,
self.count_children)
class Meta:
abstract = True
class Tree32(TreeAbstract):
id = models.IntegerField(primary_key=True)
parent = models.ForeignKey('self')
lvl = models.IntegerField(blank=False, null=False)
created_children = models.IntegerField(blank=False, null=False)
removed_children = models.IntegerField(blank=False, null=False)
label_node = models.CharField(max_length=100, blank=True)
class Meta:
abstract = True
class Tree64(TreeAbstract):
id = models.BigIntegerField(primary_key=True)
parent = models.ForeignKey('self')
lvl = models.IntegerField(blank=False, null=False)
created_children= models.BigIntegerField(blank=False, null=False)
removed_children= models.BigIntegerField(blank=False, null=False)
label_node = models.CharField(max_length=100, blank=True)
class Meta:
abstract = True
''' Для каждой созданной модели надо добавлять следующее (пример для board_group):
ALTER TABLE board_group ADD COLUMN holes bigint[];
INSERT INTO board_group values (-9223372036854775808,0,0,0,0,-9223372036854775808);
INSERT INTO tree_size values ('board_group',6,1624);
CREATE TRIGGER after_upd
AFTER UPDATE
ON board_group
FOR EACH ROW
EXECUTE PROCEDURE tree_after_upd_parent();
CREATE TRIGGER before_del
BEFORE DELETE
ON board_group
FOR EACH ROW
EXECUTE PROCEDURE tree_before_del_row();
CREATE TRIGGER before_new
BEFORE INSERT
ON board_group
FOR EACH ROW
EXECUTE PROCEDURE tree_before_new_id();
'''
Updated 12 Sept. 2015, 15:58 by EvgIq.