2016-10-18 4 views
1

Ich habe ein Modell in Django, die pk ist keine ganze Zahl und es hat ein Feld, das eine manytomany ist. Diese manytomany verweist auf das Modell selbst.Django falschen Typ für Felder in Zwischentabelle erstellen (manytomany)

Als ich lief makemigration Ich habe nicht erkannt, aber es hat nicht die Felder in der Zwischentabelle als char(N) erstellt. In der Tat schafft es als integer. Diese

# models.py 
class Inventory(models.Model): 
    sample_id = models.CharField(max_length=50, primary_key=True) 
    parent_id = models.ManyToManyField("self") 

wirft Fehler, wenn ich versuche Objekte Modell zu meinen Eltern

>>> p = Inventory.objects.get(sample_id='sample01') 
>>> child = Inventory.objects.get(sample_id='sample02') 
>>> p.parent_id.add(child) 

ich den Fehler hinzufügen

psycopg2.DataError: invalid input syntax for integer: "sample02" 
LINE 1: ...HERE ("inventory_parent_id"."to_inventory_id" IN ('sample... 

ich die Felder in der Zwischentabelle sah, inventory_parent_id, erstellt von Django und ihre Typen sind nicht korrekt.

Columns (3) 
|--id (integer) 
|--from_inventory_id (integer) 
|--to_inventory_id (integer) 

Meine Fragen sind: Ist es schlecht, wenn ich die Typen manuell ändern? Wird es die Migrationen brechen? Oder musste ich etwas tun, damit Django diesen irreführenden Typ erkennen kann?

Antwort

0

Versuchen Migrationen (Unapply Migrationen unter Verwendung ./manage.py migrate YOURAPP PREVIOUS_MIGRATION_NUMBER oder ./manage.py migrate YOURAPP zero wenn es erste Migration ist) neu zu erstellen, Migrationsdatei entfernen (nicht über .pyc Datei vergessen) und erneut zu generieren.

Wenn das nicht hilft, können Sie versuchen, benutzerdefinierte Tabelle mit den richtigen Migrationsfeldern zu erstellen und dann diese Migration neu zu erstellen.

+0

Ich denke ich weiß, wo das Problem herkommt. Ich habe zuerst das Feld 'manytomany' erstellt und' makemigrations' + 'migrate' ausgeführt. Dann änderte ich den PK des Feldes in ein Char-Feld und Django erkannte die Änderung der Zwischentabelle nicht. Ich werde die Migration zu den beiden vorherigen fälschen und es erneut versuchen. – mk2

+0

Auch wenn die Antwort nicht ganz das ist, was ich tun musste, habe ich als akzeptiert markiert. Es passierte genau wie mein vorheriger Kommentar. Ich fälsche die Migration auf zwei vorherige, erstelle eine Migration für die Änderung von pk und erstelle dann eine weitere Migration, die das Feld in manytomany ändert. Ich konnte es nicht in einer Migration schaffen, weil es sich beschwerte, dass die Feld-ID nicht entfernt werden konnte ... – mk2

Verwandte Themen