Рубрики
Без рубрики

Модель Django Отношения без запуска миграции в существующей базе данных

Существуют случаи использования, когда мы работаем над устаревшей системой и не позволяем изменять / изменять ограничения БД, но хотят использовать функции Djando ORM также. Этот пост поможет создать ограничения на разных отношениях модели Django без проведения миграции в существующей базе данных. Теги с Python, Django, Backend, WebDev.

В моем предыдущем посте мы обсудили о том, как мы можем создавать модели 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”