Ich glaube nicht, dass Sie Hilfe bei der Behebung dieses Problems benötigen, sondern eher Hilfe beim Debuggen. Sobald das Problem klar ist, scheint auch die Lösung klar zu sein. Das Traceback ist vielleicht etwas unklar, weil es so viel Django-Quellcode durchläuft und Ihnen nicht sagt, welches Ihrer Felder ein Problem hat.
Hintergrund dieser Ausgabe
Zunächst einmal haben wir Probleme beim Speichern eines Post
Beispiel. Schauen Sie sich all diese Felder an, die Sie in Ihrer Modelldefinition haben:
...
url = models.URLField(max_length=250, blank=True, null=True)
video = EmbedVideoField(verbose_name='link',help_text="Youtube", blank=True, null=True)
content = RichTextUploadingField(config_name='default')
image = models.ImageField(upload_to='images',blank=True, null=True)
thumbnail = models.ImageField(upload_to='images', blank=True, null=True)
Diese dürfen nicht so aussehen Textfelder, aber viele von ihnen sind Variationen von Textfeldern, denn wenn Sie darüber nachdenken, werden Sie wahrscheinlich nicht ganze Dateien speichern in Ihrer Datenbank. Was Sie stattdessen tun werden (und was Django standardmäßig tut), ist, die Datei irgendwo auf einer Festplatte zu speichern und dann in der Datenbank den Pfad zu speichern zu dieser Datei, damit Sie sie bei Bedarf abrufen können.
Außerdem ist es wahrscheinlich eine Verschwendung, Dateipfade in der Datenbank als LongText
zu speichern oder was auch immer, also jedes FileField
we have bedeutet, dass wir ein Feld mit einer max_length
haben ob wir es angeben oder nicht. Daher haben alle oben genannten Felder eine implizite max_length
. Sie können dies tatsächlich herausfinden, indem Sie den Django-Quellcode lesen.
Quellenbeispiele
Ich habe EmbedVideoField
noch nie verwendet , aber es stellt sich als eine Unterklasse von models.URLField
, was bedeutet, dass es eine max_length
hat standardmäßig auf 200 gesetzt wenn Sie keine angeben.
Außerdem Ihre verschiedenen ImageField
s sind nur Unterklassen von FileField
, das einen max_length
Standardwert 100
.
Wie kann man solche Probleme in Zukunft debuggen?
Nun, das hilft uns nicht zu wissen, welche Ihrer Felder gibt in diesem Fall einen Fehler aus. Dafür würde ich wahrscheinlich irgendwo im Code einen Breakpoint setzen, wahrscheinlich hier:
File "ebagu/main/models.py" in save
66. super(Post, self).save(*args, **kwargs)
Mit "Haltepunkt setzen" meine ich Folgendes:
Gehen Sie zu Zeile 65 im oben erwähnten Modul ebagu/main/models.py
und geben Sie Folgendes ein und speichern Sie das Modul:import pdb; pdb.set_trace()
(Eigentlich habe ich eine starke Vorliebe für ipdb selbst, aber das erfordert Ipython, das ich auch stark bevorzuge...)
Führen Sie Ihren lokalen Server aus und führen Sie die Schritte durch, die dieses Problem verursacht haben. Am Ende senden Sie Ihr Formular und wenn Sie sich die Konsole ansehen, in der Sie Ihren Server gestartet haben, werden Sie schließlich direkt in Zeile 65 in eine Shell geworfen. Diese Shell ist ein PDB-Shell
, die andere Regeln als eine normale Shell hat, aber Sie können Ihren zu speichernden Post
auswerten Instanz, indem Sie sich die verschiedenen Felder der Instanz selbst ansehen, self
, und Ausführen von Python-Code im Kontext dieses Methodenaufrufs:
(pdb) len(self.image.path)
Damit würde ich die verschiedenen Felder manuell auswerten und nachsehen, welches diesen wirklich langen Eintrag hat, der das Speichern erstickt (wahrscheinlich eines Ihrer ImageField
s).
Lösung mit Warnungen
Alternativ können Sie einfach eine max_length
hinzufügen zu all diesen, aber seien Sie gewarnt, dass Sie höchstwahrscheinlich Datenbankmigrationen durchführen müssen für jedes begrenzte Textfeld, das Sie ändern, da Ihre Datenbank immer noch die Länge der Eingabe anhand der Definition der Spalte überprüft. Hier ist eine gute StackOverflow-Antwort, die sich genau mit diesem Problem beschäftigt
.
Fußnote
Warum ist das nicht aufgetaucht, bevor Sie zu Postgresql gewechselt sind? Es gibt eine Vielzahl möglicher Gründe, aber es hat wahrscheinlich damit zu tun, wie die vorherige Datenbank eingerichtet wurde im Vergleich zur Einrichtung der Postgresql-Datenbank (manuelle vs. Django-Migrationen?).
Es kann auch damit zu tun haben, ob Sie den Speicherort dieser Dinge geändert haben oder nicht. Haben Sie Ihre MEDIA
geändert? Einstellungen, sodass die Pfade, in denen Dateien gespeichert werden, viel länger wurden?
Was Sie wirklich tun sollten, ist, direkt in Ihre Datenbank zu schauen. Öffnen Sie ein psql
Beispiel und bitten Sie es, Ihre Tabellen für Sie zu beschreiben. Es wird Ihnen sagen, welche Felder auf 100 Zeichen begrenzt sind und welche Felder Ihnen Probleme bereiten.