Jeg tror ikke, du har brug for hjælp til at løse dette problem, så meget som du har brug for hjælp til at fejlfinde det. Når først problemet er klart, virker løsningen også klar. Sporingen er måske lidt uklar, fordi den gennemgår så meget Django-kildekode, og den fortæller dig ikke, hvilke af dine felter der har et problem.
Baggrund for dette nummer
Til at begynde med har vi problemer med at gemme et Post
eksempel. Nå, se på alle disse felter, du har i din modeldefinition:
...
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)
Disse ligner muligvis ikke tekstfelter, men mange af dem er variationer af tekstfelter, fordi hvis du tænker over det, vil du sandsynligvis ikke gemme hele filer i din database. Det du vil gøre i stedet for (og hvad Django gør som standard) er at gemme filen et sted på en disk, og derefter i databasen vil du gemme stien til den fil, så du kan hente den, når du har brug for det.
Ydermere er det sandsynligvis spild at gemme filstier i db'en som LongText
eller hvad som helst, så hvert FileField
vi har betyder, at vi har et felt med en max_length
om vi angiver det eller ej. Således har alle ovenstående felter en implicit max_length
. Du kan faktisk finde ud af dette ved at læse Django-kildekoden.
Kildeeksempler
Jeg har aldrig brugt EmbedVideoField
, for eksempel, men det viser sig at være en underklasse af models.URLFeld
, hvilket betyder, at den har en max_length
som standard hvis du ikke angiver en.
Desuden dine forskellige
Med "indstil et brudpunkt" mener jeg følgende:
Gå til linje 65 i modulet nævnt ovenfor,
(Jeg har faktisk en stærk præference for ipdb mig selv, men det kræver Ipython, som jeg også har stor forkærlighed for...)
Kør din lokale server, og kør gennem de trin, der forårsagede dette problem. Du vil ende med at indsende din formular, og hvis du ser på konsollen, hvor du startede din server, vil du til sidst blive dumpet ind i en shell lige ved linje 65. Denne shell er en pdb shell
, som har andre regler end en normal shell, men du kan evaluere dit
Ved at bruge det, ville jeg manuelt evaluere de forskellige felter og se på, hvilken af dem der har denne virkelig lange post, der kvæler lagringen (sandsynligvis en af dine
Løsning med advarsler
Alternativt kan du bare tilføje en
Fodnote
Hvorfor dukkede dette ikke op, før du skiftede til Postgresql? Der er en række potentielle årsager, men det har sandsynligvis at gøre med, hvordan den tidligere database blev sat op i forhold til hvordan Postgresql-databasen blev sat op (manuelt vs. Django-migreringer?).
Det kan også have at gøre med, om du har ændret, hvor disse ting bliver opbevaret. Har du ændret din
Hvad du virkelig bør gøre er at se direkte på din database. Åbn en ImageField
s er blot underklasser af FileField
, ebagu/main/models.py
og indtast følgende og gem modulet:import pdb; pdb.set_trace()
Post
, der skal gemmes, instans, ved at se på de forskellige felter på selve instansen, self
, og kører Python-kode i konteksten af det metodekald:(pdb) len(self.image.path)
ImageField
s).max_length
til alle disse, men vær opmærksom på, at du højst sandsynligt skal udføre databasemigreringer for ethvert begrænset tekstfelt, du ændrer, fordi din database stadig vil verificere længden af input i forhold til, hvordan kolonnen er defineret. Her er et godt StackOverflow-svar, der ser på netop dette problem
.MEDIA
indstillinger, så stierne, hvor filerne gemmes, blev meget længere? psql
og bed den om at beskrive dine borde for dig. Den fortæller dig, hvilke felter der er begrænset til 100 tegn, og det er de felter, der giver dig problemer.