django Hinzufügen eines ManyToMany-Felds / Tabelle zum vorhandenen Schema, related_name error

8

Ich habe ein bestehendes Projekt mit Modellen (Benutzer und Bücher). Ich möchte ein ManyToMany (M2M) -Feld dem vorhandenen Modell Bücher hinzufügen, aber der Syncbb-Befehl tut dies nicht.

Details: Bücher haben bereits ein FK-Feld, das dem Benutzer zugeordnet ist, und ich möchte ein neues M2M-Feld (Leser) hinzufügen, das auch dem Benutzer zugeordnet ist. Wie Sie wissen, kümmert sich Djangos Syncdb nur um Tabellen, daher ist das Hinzufügen eines normalen Felds einfach, aber ein M2M benötigt eine neue Join-Tabelle (app_books_user), also sollte syndb nicht wie jede andere neue Tabelle hinzufügen? Es hat meine andere beigefügte Tabelle für das "Verkäufer" -Feld des Buches erstellt.

Als ich syndb ausgeführt habe, erhielt ich zunächst einen Fehler, der mich anwies, das Argument 'related_name' zu verwenden, um die beiden Verweise auf User zu unterscheiden. Ich habe diese hinzugefügt. Wenn ich syndb erneut ausführe, erstellt es jedoch nicht die neue Join-Tabelle (aber jetzt ist es fehlerfrei). Das neue Feld existiert, wenn ich es über die Shell anschaue, kann es aber nicht verwenden, da die Join-Tabelle nicht existiert. Ich schaute auf den SQL-Code über 'sqlall' cmd und es druckt das SQL für die neue Tabelle, aber es wird nicht ausgeführt.

Was vermisse ich? Soll ich das SQL (aus dem SQL-Server) nur über meinen Datenbankbrowser erzwingen? Wird das irgendwelche Auswirkungen haben? Code folgt:

Models.py

%Vor%

Danke

    
rich 21.10.2010, 16:28
quelle

1 Antwort

6

syncdb ändert keine vorhandenen Tabellen (Modelle). Was passiert, ist, dass, obwohl das Hinzufügen eines M2M keine Tabelle ändert (es sollte nur eine Join-Tabelle hinzugefügt werden), die Syncdb die neue Tabelle nicht erstellen, weil sie sieht, dass das Modell bereits in der DB ist und es überspringt. Weitere Informationen finden Sie in der syncdb-Dokumentation

  

[syncdb] Erstellt die Datenbanktabellen für alle Apps in INSTALLED_APPS, deren Tabellen noch nicht erstellt wurden.

Es ist ein wenig verwirrend, da diese Tabelle technisch nicht erstellt wurde, aber das Verhalten macht Sinn "Wurde die Tabelle für dieses Modell erstellt? Ja! Dann synchronisieren Sie es nicht."

Im Allgemeinen bietet django keinen Mechanismus zum Migrieren von Datenbankschemas (dh Hinzufügen von Spalten und dergleichen). Also, Sie müssen diese Art von Sache über Raw SQL oder mit einem Drittanbieter-Tool tun. Ich empfehle sehr, Süden auszuprobieren.

    
rz. 29.10.2010 19:54
quelle

Tags und Links