Замечательная СУБД PostgreSQL имеет возможность создавать поля-массивы:
from django.contrib.postgres.fields import ArrayField
class AdDO(models.Model):
...
tags_name = ArrayField(models.CharField(max_length=40,
blank=True, null=True),
blank=True, null=True)
tags_slug = ArrayField(models.CharField(max_length=40,
blank=True, null=True),
blank=True, null=True)
Так же, на эти поля, можно делать индексы. В файле миграции это выглядит так:
from __future__ import unicode_literals
from django.db import migrations
from ads.models import AdDO
from psycopg2.extensions import AsIs
class Migration(migrations.Migration):
dependencies = [
('ads', '0001_initial'),
]
operations = [
migrations.RunSQL(
[("CREATE INDEX ads_addo_tags_name_gin ON %s USING gin"
"(tags_name);", [AsIs(AdDO._meta.db_table)])],
[('DROP INDEX ads_addo_tags_name_gin;', None)],
),
migrations.RunSQL(
[("CREATE INDEX ads_addo_tags_slug_gin ON %s USING gin"
"(tags_slug);", [AsIs(AdDO._meta.db_table)])],
[('DROP INDEX ads_addo_tags_slug_gin;', None)],
),
]
И если сделать простую таблицу меток:
class Tag(models.Model):
slug = models.CharField(max_length=40, primary_key=True, blank=True)
name = models.CharField(max_length=40, db_index=True)
... то вроде как можно получить механизм, который позволит обойтись без реляционных связей и будет работать быстрее. Да, конечно, только в случае, если не критична ссылочная целостность (а мне она не критична так как метки я буду создавать только сам, изменяться они не будут, юзеры же будут юзать только уже имеющиеся)
Назрела задача решить вопрос Auto-Complete для поля ArrayField
(в моем примере это поле называется tags_name
). То есть, чтобы было типа как здесь: https://youtu.be/fJIHiqWKUXI?t=8m15s
Может уже есть готовое решение? Может быть как-то можно даже использовать и упомянутый django-autocomplete-light
? только я пока не понял как :)
Если у кого есть опыт мультиавтокомплита для поля ArrayField
, подскажите (или просто соображения, без опыта). Буду премного благодарен :)
(интересует только вопрос заполнения поля tags_name
и в админке и в прочих формах, синхронизацию с tags_slug
планирую тупо в методе save
)