Это необработанный запрос, который я пишу для postgres для ограничения проверки
ALTER TABLE rea_asplinkage ADD CONSTRAINT asp_sub_project_positive_integer
CHECK (
jsonb_typeof(linkage-> 'root' -> 'in_sub_project') is not distinct from 'number'
and (linkage->'root'->>'in_sub_project')::numeric % 1 = 0
and (linkage->'root'->>'in_sub_project')::numeric > 0
);
И способ, которым я создаю миграцию, таков:
# Generated by Django 2.2.10 on 2020-05-16 12:59
from django.db import connection, migrations
class Migration(migrations.Migration):
dependencies = [("rea", "0029_asplinkage")]
operations = [
migrations.RunSQL(
sql="""
ALTER TABLE rea_asplinkage ADD CONSTRAINT asp_sub_project_positive_integer
CHECK (
jsonb_typeof(linkage-> 'root' -> 'in_sub_project') is not distinct from 'number'
and (linkage->'root'->>'in_sub_project')::numeric % 1 = 0
and (linkage->'root'->>'in_sub_project')::numeric > 0
);
""",
reverse_sql="""
ALTER TABLE rea_asplinkage DROP CONSTRAINT "asp_sub_project_positive_integer";
""",
)
]
И это работает.
Но это означает, что моя исходная модель не показывает ограничение в class Meta
модели ASPLinkage.
class ASPLinkage(TimeStampedModel, SoftDeletableModel, PersonStampedModel, OrganizationOwnedModel):
linkage = JSONField(default=default_linkage_for_asp)
objects = OrganizationOwnedSoftDeletableManager()
Я пробовал ExpressionWrapper
и RawSQL
при создании ограничений внутри класса Meta, но это все равно не работает.
Для справки я просмотрел примеры, найденные в https://github.com/django/django/blob/master/tests/constraints/models.py#L12
Я также просмотрел раздельную миграцию базы данных и состояния через https://realpython.com/create-django-index-without-downtime/#when-django-generates-a-new-migration
Но я все еще не могу заставить его работать
Так это вообще возможно?
Обновлять
Позвольте мне написать краткое изложение моего вопроса для лучшей читабельности.
- Я хочу написать ограничения для JSONField.
- Я могу сделать это прямо на Postgres
- Поэтому я могу сделать это, используя необработанный sql в файле миграции.
- Но я не могу сделать то же самое, используя мета/CheckConstraint модели Django, как это обычно делают все. См. https://docs.djangoproject.com/en/3.0/ref/models/constraints/
- Итак, как мне переписать этот необработанный sql, чтобы создать ограничение на jsonfield в postgres, но в стиле Django?
models.PositiveIntegerField
вместо этого? - person voodoo-burger   schedule 16.05.2020