Декларативный механизм для строк моделей Django

С некоторой периодичностью я сталкиваюсь с моделями, содержимое которых приблизительно постоянно. Например, у меня может быть набор планов, на которые могут подписаться пользователи, с различными атрибутами - ID, имя, порядок в списке планов, стоимость, должен ли покупатель быть студентом/FOSS-проектом/и т.д.. Я собираюсь редко добавлять/удалять/изменять строки, а когда я это делаю, то, скорее всего, придется менять и код (например, менять целевые страницы), поэтому я хотел бы, чтобы содержание модели (не только схема) управлялось в коде, а не через админку Django (и, соответственно, использовать pull requests для управления ими, убедиться, что тестовые деплои синхронизированы и т.д.). Я бы также хотел, чтобы это было в базе данных, чтобы я мог выбирать их, используя любой столбец модели, фильтровать для таких вещей, как "показать мне любой проект, принадлежащий платному аккаунту" и т.д.

Какие есть хорошие способы справиться с этим?

Я думаю, что моим идеалом было бы что-то вроде "иметь список экземпляров модели в моем коде, и либо ORM Django волшебным образом делает вид, что они действительно находятся в базе данных, либо makemigrations делает миграцию данных за меня", но я не думаю, что такое существует?

Два рабочих подхода, которые приходят на ум, это либо писать миграции данных вручную, либо использовать обычные классы (или dicts) и писать любые геттеры и фильтры, которые мне действительно нужны, вручную.

Миграции данных дают мне всю функциональность Django ORM, которую я могу пожелать, но каждый раз, когда я изменяю строку, мне нужно писать миграцию вручную, а чтобы узнать фактическое состояние, нужно либо заглянуть в админку Django, либо просмотреть все миграции данных, чтобы выяснить их совокупное влияние. (О, и если кто-то случайно удалит объекты в базе данных (скорее всего, на тестовой установке...) или миграция будет ошибочной, восстановление будет беспорядочным.)

Просто использование не-ORM классов в источнике - более ясный, более декларативный подход, но мне нужны замены для многих вещей, которые я обычно делаю в ORM (.objects.get(...), __plan__is_student, .values(plan__is_student).annotate(...) и т.д.).

Какой из этих подходов лучше, предположительно, зависит от того, сколько функциональности ORM мне на самом деле нужно и как часто я рассчитываю что-то менять.

Есть ли другие хорошие подходы для этого? Может быть, я упустил какую-то функцию Django (или дополнение), которая облегчает эту задачу?

Вернуться на верх