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?
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
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