Как предотвратить создание миграций 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
с серверной частью GoogleCloudStoragemakemigrations
выполняется нормально в CI и локальном dev- Единственным полем, запускающим эти миграции, является
FileField
с динамической логикой сегмента