uchill/backend/apps/schedule/migrations/0006_migrate_subject_data.py

81 lines
3.1 KiB
Python

# Generated manually to migrate subject data from CharField to ForeignKey
from django.db import migrations, connection
def migrate_subject_data_forward(apps, schema_editor):
"""
Перенос данных из старого поля subject (CharField) в subject_name.
Выполняется перед изменением типа поля subject на ForeignKey.
"""
# Проверяем тип колонки subject в базе данных
with connection.cursor() as cursor:
# Для таблицы lessons
cursor.execute("""
SELECT data_type
FROM information_schema.columns
WHERE table_name = 'lessons' AND column_name = 'subject'
""")
result = cursor.fetchone()
if result and result[0] == 'character varying': # CharField в PostgreSQL
# Переносим данные из subject в subject_name для Lesson
cursor.execute("""
UPDATE lessons
SET subject_name = subject
WHERE subject IS NOT NULL
AND subject != ''
AND (subject_name IS NULL OR subject_name = '')
""")
# Для таблицы lesson_templates
cursor.execute("""
SELECT data_type
FROM information_schema.columns
WHERE table_name = 'lesson_templates' AND column_name = 'subject'
""")
result = cursor.fetchone()
if result and result[0] == 'character varying': # CharField в PostgreSQL
# Переносим данные из subject в subject_name для LessonTemplate
cursor.execute("""
UPDATE lesson_templates
SET subject_name = subject
WHERE subject IS NOT NULL
AND subject != ''
AND (subject_name IS NULL OR subject_name = '')
""")
def migrate_subject_data_backward(apps, schema_editor):
"""
Обратная миграция - перенос данных из subject_name обратно в subject.
"""
Lesson = apps.get_model('schedule', 'Lesson')
LessonTemplate = apps.get_model('schedule', 'LessonTemplate')
# Переносим данные из subject_name обратно в subject для Lesson
for lesson in Lesson.objects.all():
if lesson.subject_name:
lesson.subject = lesson.subject_name
lesson.save(update_fields=['subject'])
# Переносим данные из subject_name обратно в subject для LessonTemplate
for template in LessonTemplate.objects.all():
if template.subject_name:
template.subject = template.subject_name
template.save(update_fields=['subject'])
class Migration(migrations.Migration):
dependencies = [
('schedule', '0005_lesson_subject_name_lessontemplate_subject_name_and_more'),
]
operations = [
migrations.RunPython(
migrate_subject_data_forward,
migrate_subject_data_backward,
),
]