Как предотвратить создание миграций Django при использовании динамического GoogleCloudStorage в FileField?

Мы работаем над проектом на Django, который хранит видеофайлы в Облачном хранилище Google, используя FileField.

В нашей модели мы определяем хранилище по умолчанию следующим образом:

from storages.backends.gcloud import GoogleCloudStorage
from django.conf import settings

DEFAULT_STORAGE = GoogleCloudStorage(bucket_name=settings.DEFAULT_GCS_BUCKET)

class Recording(models.Model):
    raw_file_gcp = models.FileField(blank=True, null=True, storage=DEFAULT_STORAGE)

Однако в некоторых частях системы мы перемещаем файлы между двумя разными корзинами GCS:

  • Один для регулярного использования (например, default-bucket)
  • Другое для целей хранения или архивирования (например, retention-bucket)

Для этого мы динамически обновляем атрибут .name файла на основе логики в серверной части:

recording.raw_file_gcp.name = path_with_retention_bucket
recording.save(update_fields=["raw_file_gcp", "updated_at"])

Поскольку базовый класс storage содержит имя сегмента, при каждом запуске makemigrations, Django обнаруживает изменение и добавляет миграцию следующим образом:

migrations.AlterField(
    model_name='recording',
    name='raw_file_gcp',
    field=models.FileField(blank=True, null=True, storage=myapp.models.CustomStorage(bucket_name='default-bucket')),
)

Но на самом деле ничего не изменилось в модели.

Чтобы избежать этих ненужных AlterField миграций, мы реализовали пользовательский класс хранилища, используя @deconstructible и __eq__:

from django.utils.deconstruct import deconstructible
from storages.backends.gcloud import GoogleCloudStorage

@deconstructible
class NeutralGCSStorage(GoogleCloudStorage):
    def __eq__(self, other):
        return isinstance(other, NeutralGCSStorage)

, А затем использовал:

DEFAULT_STORAGE = NeutralGCSStorage(bucket_name=settings.DEFAULT_GCS_BUCKET)

Но Django по-прежнему генерирует ту же самую миграцию и не рассматривает хранилище как неизмененное.

<время работы/>

❓ То, что мы ищем

Как мы можем предотвратить создание миграций в Django, если единственное отличие заключается в динамическом хранилище, используемом в FileField?

<время работы/>

✅ Контекст

  • Django 5.x
  • django-storages с серверной частью GoogleCloudStorage
  • makemigrations выполняется нормально в CI и локальном dev
  • Единственным полем, запускающим эти миграции, является FileField с динамической логикой сегмента
<время работы/>
Вернуться на верх