Django изменить развернутый столбец со значениями в ForeignKey - PullRequest
0 голосов
/ 20 марта 2020

У меня есть следующая модель:

class IssueDescription(models.Model):
    no = models.CharField(max_length=10, primary_key=True)
    title = models.CharField(max_length=200, blank=False)
    confirm = models.TextField()
    remedy = models.TextField()
    subsystem = models.CharField(max_length=50, blank=False)

Она уже находится в Postgres БД и заполнена значениями. Содержащиеся в нем значения взяты из CSV-файла (включая значения подсистем). Я понял, что хотел бы сделать столбец subsystem в ForeignKey и переместить все значения из него в отдельную таблицу, например:

class Subsystems(models.Model):
    subsystem = models.CharField(max_length=50, blank=False)

class IssueDescription(models.Model):
    no = models.CharField(max_length=10, primary_key=True)
    title = models.CharField(max_length=200, blank=False)
    confirm = models.TextField()
    remedy = models.TextField()
    subsystem = models.ForeignKey(Subsystems, on_delete=models.PROTECT, blank=False)

Какой самый чистый способ перемещения уже установленные значения в исходном столбце subsystem исходной модели IssueDescription для вновь созданной таблицы Subsystems и отрисовки всех ссылок через поле ForeignKey в новой модели IssueDescription?

1 Ответ

0 голосов
/ 20 марта 2020

Будь это я, я бы сделал это через Django оболочку. Вы можете записать поля pk и subsystem каждого экземпляра IssueDescription в файл json, а затем, после обновления моделей, использовать тот же файл json для создания и обновления обеих моделей.

python manage.py shell

from your_app.models import IssueDescription
import json

all_issues = IssueDescription.objects.all()
migrate_items = []

for issue in all_issues:
    migrate_items += {id: issue.id, subsystem: issue.subsystem}

with open("migrate_file.txt", "w") as outfile:
    json.dump(migrate_items, outfile, indent=4)

Затем go вперед и внесите свои изменения, сделайте миграцию и мигрируйте. В обратном направлении, обратно к оболочке ...

python manage.py shell

from your_app.models import IssueDescription, Subsystems
import json

with open("migrate_file.txt", "r") as f:
   data = json.load(f)

for row in data:
    subsys = Subsystems(subsystem=row["subsystem"])
    subsys.save()
    issue = IssueDescription.objects.get(id=row["id"]
    issue.subsystem = subsys
    issue.save()

Не проверял это, поэтому может потребоваться пара небольших настроек, но я думаю, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...