Postgresql триггерный огонь для поля массива на цветекторе - PullRequest
0 голосов
/ 08 апреля 2020
  • У нас есть следующая модель, которая создает событие Trigger для простого TextField при INSERT или UPDATE.
from django.db import models
from django.contrib.postgres.search import SearchVectorField
from django.contrib.postgres.indexes import GinIndex

class Page(models.Model):
    title = models.CharField(max_length=100, unique=True)
    content = models.TextField()

    # New modifications. A field and an index
    content_search = SearchVectorField(null=True)

    class Meta:
        indexes = [GinIndex(fields=["content_search"])]
  • Пользовательский файл миграции для создания события триггера для базы данных postgres.
from django.db import migrations

class Migration(migrations.Migration):

    dependencies = [
        # NOTE: The previous migration probably looks different for you, so
        # modify this.
        ('web', '0002_auto_20190524_0957'),
    ]

    migration = '''
        CREATE TRIGGER content_search_update BEFORE INSERT OR UPDATE
        ON web_page FOR EACH ROW EXECUTE FUNCTION
        tsvector_update_trigger(content_search, 'pg_catalog.english', content);

        -- Force triggers to run and populate the text_search column.
        UPDATE web_page set ID = ID;
    '''

    reverse_migration = '''
        DROP TRIGGER content_search ON web_page;
    '''

    operations = [
        migrations.RunSQL(migration, reverse_migration)
    ]

Как создать событие триггера в файле миграции для Arrayfield, поскольку tsvector_update_trigger ожидает текст или поле varchar .??

class Page(models.Model):
    title = models.CharField(max_length=100, unique=True)
    content = models.TextField()
    tags = ArrayField(models.TextField(blank=True),blank=True,null=True,default=list) ### ['wordpress','drupal']

    content_search = SearchVectorField(null=True)
    tags_search = SearchVectorField(null=True)

    class Meta:
        indexes = [GinIndex(fields=["content_search","tags_search"]),]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...