Jag tror inte att du behöver hjälp med att fixa det här problemet, så mycket som du behöver hjälp med att felsöka det. När problemet väl är klart verkar lösningen också vara klar. Spårningen är kanske lite otydlig eftersom den går igenom så mycket Django-källkod och den talar inte om vilka av dina fält som har problem.
Bakgrund till detta nummer
Till att börja med har vi problem med att spara ett Post
exempel. Tja, titta på alla dessa fält du har i din modelldefinition:
...
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)
Dessa kanske inte ser ut textfält, men många av dem är varianter av textfält eftersom du, om du tänker efter, förmodligen inte kommer att lagra hela filer i din databas. Vad du kommer att göra istället (och vad Django gör som standard) är att lagra filen någonstans på någon disk och sedan i databasen skulle du lagra sökvägen till den filen så att du kan hämta den när du behöver.
Dessutom är det förmodligen ett slöseri att lagra filsökvägar i db som LongText
eller vad som helst, så varje FileField
vi har betyder att vi har ett fält med en max_length
oavsett om vi specificerar det eller inte. Således har alla ovanstående fält en implicit max_length
. Du kan faktiskt ta reda på detta genom att läsa Django-källkoden.
Källexempel
Jag har aldrig använt
Med "ställ in en brytpunkt" menar jag följande:
Gå till rad 65 i modulen som nämns ovan,
(Jag har faktiskt en stark preferens för ipdb själv, men det kräver Ipython, vilket jag också har en stark förkärlek för...)
Kör din lokala server och gå igenom stegen som orsakade det här problemet. Det slutar med att du skickar in ditt formulär och om du tittar på konsolen där du startade din server kommer du så småningom att dumpas i ett skal precis vid rad 65. Detta skal är en pdb-skal
, som har andra regler än ett vanligt skal, men du kan utvärdera ditt
Med det skulle jag manuellt utvärdera de olika fälten och titta på vilken som har den här riktigt långa posten som stryper lagringen (förmodligen en av dina
Lösning med varningar
Alternativt kan du bara lägga till en
Fotnot
Varför dök inte detta upp innan du bytte till Postgresql? Det finns en mängd potentiella orsaker, men det har förmodligen att göra med hur den tidigare databasen konfigurerades kontra hur Postgresql-databasen konfigurerades (manuellt kontra Django-migreringar?).
Det kan också ha att göra med om du har ändrat var dessa saker lagras eller inte. Har du ändrat din
Vad du egentligen borde göra är att titta direkt på din databas. Öppna en EmbedVideoField
, till exempel, men det visar sig vara en underklass av models.URLFeld
, vilket betyder att den har en max_length
som standard ebagu/main/models.py
och skriv in följande och spara modulen:import pdb; pdb.set_trace()
Inlägg
som ska sparas. instans, genom att titta på de olika fälten på själva instansen, self
, och kör Python-kod i sammanhanget för det metodanropet:(pdb) len(self.image.path)
ImageField
s).max_length
till alla dessa, men tänk på att du med största sannolikhet kommer att behöva utföra databasmigreringar för ett begränsat textfält du ändrar eftersom din databas fortfarande kommer att verifiera längden på inmatningen mot hur kolumnen är definierad. Här är ett bra StackOverflow-svar som tittar på exakt det här problemet
.MEDIA
inställningar så att sökvägarna där filerna lagras blev mycket längre? psql
och be den beskriva dina tabeller för dig. Det kommer att berätta vilka fält som är begränsade till 100 tecken och det är de fält som ger dig problem.