तो मैं इसे ठीक करने के लिए एसक्यूएल के साथ समाप्त हुआ। मेरे समाधान का मूल नीचे है - मूल रूप से मैं
- नई प्रोफ़ाइल में user_id पर एक अनुक्रमणिका बनाएं
- विदेशी कुंजी के रूप में संदर्भित करने से पहले इस अनुक्रमणिका का अस्तित्व में होना आवश्यक है
- तालिका के माध्यम से एक नया बनाएं
- मैंने
SHOW CREATE TABLE userprofile_userprofile_subjects
के आउटपुट के साथ शुरुआत की (MySQL विशिष्ट) - मैंने मुख्य नामों और बाधाओं के नामों को थोड़ा संशोधित किया है
- मैंने
- तालिका के माध्यम से सभी डेटा को नए में कॉपी करें
- पुराने को तालिका के माध्यम से छोड़ें
- तालिका के माध्यम से पुराने का नाम रखने के लिए तालिका के माध्यम से नए का नाम बदलें
- आखिरकार वह ऑपरेशन करें जो मेरे लिए django माइग्रेशन स्वचालित रूप से जेनरेट करता है
मैं उम्मीद करता हूं कि इससे किसी की मदद होगी। और मुझे अभी भी एक बेहतर समाधान के बारे में जानने में दिलचस्पी होगी।
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
# ...
]
operations = [
migrations.RunSQL(
'ALTER TABLE userprofile_userprofile '
'ADD INDEX `userprofile_userprofile_1234abcd` (user_id)'
),
migrations.RunSQL (
'CREATE TABLE userprofile_temp_table ('
'`id` int(11) NOT NULL AUTO_INCREMENT, '
'`userprofile_id` int(11) NOT NULL, '
'`subject_id` int(11) NOT NULL, '
'PRIMARY KEY (`id`), '
'UNIQUE KEY `userprofile_userprofile_subjects_userprofile_us_7ded3060_uniq` (`userprofile_id`,`subject_id`), '
'KEY `userprofile_userprofile_subject_1be9924f` (`userprofile_id`), '
'KEY `userprofile_userprofile_subject_e5a9504a` (`subject_id`), '
'CONSTRAINT `subject_id_refs_id_69796996` FOREIGN KEY (`subject_id`) REFERENCES `otherapp_subject` (`id`), '
'CONSTRAINT `userprofile_user_id_refs_user_id_1234abcd` FOREIGN KEY (`userprofile_id`) REFERENCES `userprofile_userprofile` (`user_id`) '
') ENGINE=InnoDB AUTO_INCREMENT=35500 DEFAULT CHARSET=utf8 '
),
migrations.RunSQL (
'INSERT INTO userprofile_temp_table '
'(userprofile_id, subject_id) '
'('
' SELECT userprofile_userprofile.user_id, userprofile_userprofile_subjects.subject_id'
' FROM userprofile_userprofile_subjects'
' INNER JOIN userprofile_userprofile'
' ON userprofile_userprofile_subjects.userprofile_id ='
' userprofile_userprofile.id'
')'
),
migrations.RunSQL (
'DROP TABLE `userprofile_userprofile_subjects`'
),
migrations.RunSQL (
'RENAME TABLE `userprofile_temp_table` TO `userprofile_userprofile_subjects`'
),
migrations.RemoveField(
model_name='userprofile',
name='id',
),
migrations.AlterField(
model_name='userprofile',
name='user',
field=models.OneToOneField(
primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL
),
preserve_default=True,
),
]