Не мисля, че имате нужда от помощ за отстраняването на този проблем, толкова повече, колкото имате нужда от помощ за отстраняването му. След като проблемът е ясен, решението също изглежда ясно. Traceback може би е малко неясен, защото преминава през толкова много изходен код на Django и не ви казва кое от вашите полета има проблем.
История на този проблем
Да започнем с това, че имаме проблеми със запазването на Post
инстанция. Е, вижте всички тези полета, които имате в дефиницията на вашия модел:
...
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)
Те може да не изглеждат така текстови полета, но много от тях са вариации на текстови полета, защото, ако се замислите, вероятно няма да съхранявате цели файлове във вашата база данни. Това, което ще направите вместо това (и което Django прави по подразбиране), е да съхраните файла някъде на някакъв диск и след това в базата данни ще съхраните пътя към този файл, за да можете да го извлечете, когато имате нужда.
Освен това, вероятно е излишно да съхранявате файлови пътища в db като LongText
или каквото и да е, така че всяко FileField
имаме означава, че имаме поле с max_length
независимо дали го уточняваме или не. Следователно всички горни полета имат имплицитно max_length
. Всъщност можете да разберете това, като прочетете изходния код на Django.
Примери за източници
Никога не съм използвал EmbedVideoField
, например, но се оказва, че е подклас на models.URLField
, което означава, че има max_length
по подразбиране зададено на 200 ако не посочите такъв.
Освен това различните ви ImageField
s са само подкласове на FileField
, който има max_length
по подразбиране 100
.
Как да отстранявате грешки като този в бъдеще?
Това не ни помага да разберем кой от вашите полета хвърля грешка в този случай. За това вероятно бих задал точка на прекъсване някъде в кода, вероятно тук:
File "ebagu/main/models.py" in save
66. super(Post, self).save(*args, **kwargs)
Под „задаване на точка на прекъсване“ имам предвид следното:
Отидете на ред 65 в споменатия по-горе модул, ebagu/main/models.py
и въведете следното и запазете модула:import pdb; pdb.set_trace()
(Всъщност имам силно предпочитание към ipdb себе си, но това изисква Ipython, към който също силно предпочитам...)
Стартирайте вашия локален сървър и преминете през стъпките, довели до този проблем. В крайна сметка ще изпратите формуляра си и ако погледнете конзолата, където сте стартирали вашия сървър, в крайна сметка ще бъдете изхвърлени в обвивка точно на ред 65. Тази обвивка е pdb обвивка
, който има различни правила от нормалната обвивка, но можете да оцените вашата Post
, която предстои да бъде запазена екземпляр, като разгледате различните полета на самия екземпляр, self
, и изпълнение на код на Python в контекста на това извикване на метод:
(pdb) len(self.image.path)
Използвайки това, бих оценил ръчно различните полета и ще видя кое има този наистина дълъг запис, който задушава запазването (вероятно едно от вашите ImageField
s).
Решение с предупреждения
Като алтернатива можете просто да добавите max_length
към всички тези, но бъдете предупредени, че най-вероятно ще трябва да извършите миграции на база данни за всяко ограничено текстово поле, което променяте, защото вашата база данни все още ще проверява дължината на входа спрямо това как е дефинирана колоната. Ето добър отговор на StackOverflow, разглеждащ точно този проблем
.
Бележка под линия
Защо това не се появи, преди да преминете към Postgresql? Има различни потенциални причини, но вероятно е свързано с това как е била настроена предишната база данни спрямо това как е била настроена базата данни на Postgresql (ръчно срещу миграции на Django?).
Може да е свързано и с това дали сте променили мястото, където се съхраняват тези неща. Променихте ли своята MEDIA
настройки, така че пътищата, където се съхраняват файловете, станаха много по-дълги?
Това, което наистина трябва да направите, е да гледате директно вашата база данни. Отворете psql
пример и го помолете да опише вашите таблици вместо вас. Ще ви каже кои полета са ограничени до 100 знака и това са полетата, които ви създават проблеми.