Самый простой способ переименовать модель, используя Django / South?

Это зависит от типа синхронизации ... например:

  • Если ваш процесс синхронизации состоит из загрузки только 1 файла, который содержит все новые данные (скажем, файл JSON), это легко. Вам просто нужно измерить, сколько из файла вы загрузите (посмотрите этот вопрос Загрузите файл с Android и покажите прогресс в ProgressDialog )
  • Если ваш процесс синхронизации включает загрузку разных файлов (скажем, изображений, текста и т. д.) ... вы можете реализовать индикатор выполнения, в зависимости от того, сколько файлов осталось загрузить (и, надеюсь, сколько они веса).
  • Если вы загружать разные файлы, но они отличаются от одной синхронизации к другой, вы можете сначала задать сервер, сколько файлов будет использовать синхронизация, и размер каждого файла. Затем выполните то же самое, что и выше.

В идеале вы должны учитывать размер файлов, которые вы получаете + количество времени, которое вы тратите, используя их.

141
задан vaughnkoch 27 June 2019 в 12:57
поделиться

2 ответа

Чтобы ответить на ваш первый вопрос, простое переименование модели / таблицы довольно просто.Выполните команду:

./manage.py schemamigration yourapp rename_foo_to_bar --empty

(Обновление 2: попробуйте - auto вместо - empty , чтобы избежать предупреждения ниже. Спасибо @KFB за подсказку.)

Если вы используете старую версию south, вам понадобится startmigration вместо schemamigration .

Затем вручную отредактируйте файл миграции, чтобы он выглядел следующим образом:

class Migration(SchemaMigration):

    def forwards(self, orm):
        db.rename_table('yourapp_foo', 'yourapp_bar')


    def backwards(self, orm):
        db.rename_table('yourapp_bar','yourapp_foo')   

Вы можете сделать это проще, используя db_table Meta-опцию в вашем классе модели. Но каждый раз, когда вы это делаете, вы увеличиваете унаследованный вес своей кодовой базы - если имена классов отличаются от имен таблиц, ваш код сложнее понимать и поддерживать. Я полностью поддерживаю такие простые рефакторинги для ясности.

(обновление) Я только что попробовал это в производственной среде и получил странное предупреждение, когда пошел применить миграцию. Он сказал:

 Следующие типы контента устарели и должны быть удалены:

yourapp | фу
Любые объекты, связанные с этими типами содержимого внешним ключом, также будут
быть удаленным. Вы действительно хотите удалить эти типы контента?
Если вы не уверены, ответьте «нет».

Я ответил «нет», и вроде все было хорошо.

130
ответ дан 23 November 2019 в 23:11
поделиться

Юг не может этого сделать сам - откуда он знает, что Бар представляет то, что раньше Foo ? Я бы написал для этого индивидуальную миграцию. Вы можете изменить свой ForeignKey в коде, как вы это делали выше, а затем это просто случай переименования соответствующих полей и таблиц, что вы можете делать как хотите.

Наконец, действительно ли вам это нужно? Мне еще не нужно было переименовывать модели - имена моделей - это всего лишь деталь реализации - особенно с учетом доступности мета-опции verbose_name .

5
ответ дан 23 November 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: