Wie schreibe ich eine Migration, um den Primärschlüssel des Modells mit ManyToManyField zu ändern?
Ich habe einUserProfile
Modell, das auf mein @ verweiUser
Modell mit einemOneToOneField
. Ich benutze auch daspost_save
Signal zum automatischen Erstellen desUserProfile
wenn der Benutzer angelegt wird. Dies funktioniert hervorragend, außer wenn ein Benutzer über den Administrator erstellt wird (wo ich eine Inline verwende), wenn ich eine Fehlermeldung über das Duplizieren eines Profils erhalte.Diese Antwort empfiehlt, den Primärschlüssel auf das OneToOneField zu setzen, das sich auf Benutzer @ bezieh.
So vorher:
class UserProfile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL)
# ...
subjects = models.ManyToManyField(Subject, null=True, blank=True)
Nac
class UserProfile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, primary_key=True)
# ...
subjects = models.ManyToManyField(Subject, null=True, blank=True)
Ich versuche das mit den Migrationen in Django 1.7 zu machen, aber das Leben wird durch die Tatsache kompliziert, dass das Profil eine Anzahl von @ haManyToManyField
- so beziehen sie sich alle auf dasid
Feld desUserProfile
model. @ Verwendmakemigrations
erstellt die Migrationen, um den Benutzer zum Primärschlüssel zu machen und das alte ID-Feld zu löschen, ignoriert jedoch ManyToManyField.
Ich gehe derzeit ein Kaninchenbau mit vielenRunSQL
-Anweisungen in der Migration zum Ändern der Durch-Tabelle für dasManyToManyField
. Ich habe gerade einen anderen Fehler gefunden, bei dem der Name der Einschränkung in einer Tabelle nicht mit der anderen identisch ist.
So meine Frage ist: gibt es eine Methode in Django-Migrationen, die die Arbeit des Änderns der Durch-Tabelle erledigt, so dass sie auf den neuen Primärschlüssel verweist und alle Einschränkungen, Schlüssel usw. aktualisiert? Wenn nicht, wie geht man am besten mit dieser Situation um?
Ich benutze Django 1.7 mit MySQL.