В моем предыдущем посте мы обсудили о том, как мы можем создавать модели Django существующей базы данных с помощью команды Inspectdb
Отказ Расширение к этому посту, в этом посте мы постараемся создать отношения иностранных ключей между моделями, где наши существующие таблицы не имеют ограниченных ключей. Также, как это устаревшая система, наш корпус использования – не запускать миграции этих ограничений.
Создание моделей Django существующей БД
Idris Rampurawala · 24 ’19 · 3 мин читать
- Мы создали модели Django нашей существующей базы данных
- Наша существующая база данных не имеет никакого ограничения внешнего ключа на любой таблице
- Мы хотим использовать Django-Orm для запроса таблиц
- Мы не хотим мигрировать/создавать эти ограничения в существующей базе данных, поэтому наша база данных будет нетронута
Для достижения этого давайте рассмотрим следующие модели Django в качестве примера
class Manufacturer(models.Model): pass class Car(models.Model): manufacturer_id = models.IntegerField()
Конечно, наш мотив состоит в том, чтобы изменить модель, где Производитель_Ид
Integerfield
становится Производитель
Иностранник
я
class Manufacturer(models.Model): pass class Car(models.Model): manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE, related_name="manufacturer")
Это может быть достигнуто в 2 этапа:
Шаг 1 – Изменить поле в модели Django
Мы изменим Integerfield
к Иностранник
поле
class Car(models.Model): manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE, related_name="manufacturer")
Шаг 2 – Добавить фиктивную миграцию
Мы вручную создаем файл миграции под appname/миграции
# Generated manually from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ # Car - Manufacturer Relation migrations.AlterField( model_name='Car', name='manufacturer_id', field=models.IntegerField(db_column='manufacturer_id') ), migrations.RenameField( model_name='Car', old_name='manufacturer_id', new_name='manufacturer', ), migrations.AlterField( model_name='Car', name='manufacturer', field=models.ForeignKey( to='appName.Manufacturer', on_delete=models.CASCADE), ), ] # Note: Change appName to your app name consisting the models
Как только вы создадите и сохраните этот файл миграции, теперь вы можете получить доступ к связанной модели. Помните, что мы не бегаем миграции в базе данных! Хитрость вот что, мы просто позволяем Django знать о моделях отношениях, но на самом деле она не существует.
Там могут быть несколько способов достижения результата, но уверяют, я тоже пробовал это на производстве.
Я надеюсь, что это будет полезно!
Оригинал: “https://dev.to/idrisrampurawala/django-model-relationships-without-running-migration-on-existing-database-1haf”