- У нас есть следующая модель, которая создает событие 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"]),]