Nie sądzę, że potrzebujesz pomocy w rozwiązaniu tego problemu, tak bardzo, jak potrzebujesz pomocy w jego debugowaniu. Gdy problem jest jasny, rozwiązanie również wydaje się jasne. Traceback jest być może nieco niejasny, ponieważ przechodzi przez tak dużo kodu źródłowego Django i nie mówi, które z twoich pól jest problematyczne.
Tło tego problemu
Na początek mamy problemy z zapisaniem Post
instancja. Cóż, spójrz na wszystkie te pola, które masz w definicji modelu:
...
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)
Mogą one nie wyglądać pola tekstowe, ale wiele z nich to odmiany pól tekstowych, ponieważ jeśli się nad tym zastanowisz, prawdopodobnie nie będziesz przechowywać całych plików w Twojej bazie danych. Zamiast tego (i co robi Django domyślnie) przechowasz plik gdzieś na jakimś dysku, a następnie w bazie danych będziesz przechowywać ścieżkę do tego pliku, dzięki czemu można go odzyskać, gdy zajdzie taka potrzeba.
Co więcej, prawdopodobnie marnotrawstwem jest przechowywanie ścieżek plików w bazie danych jako LongText
lub cokolwiek, więc każde FileField
mamy oznacza, że mamy pole z max_length
czy to określamy, czy nie. Zatem wszystkie powyższe pola mają niejawną max_length
. Możesz się tego dowiedzieć, czytając kod źródłowy Django.
Przykłady źródłowe
Nigdy nie korzystałem z EmbedVideoField
, na przykład, ale okazuje się, że jest to podklasa models.URLField
, co oznacza, że ma max_length
domyślnie ustawiono na 200 jeśli nie określisz żadnego.
Co więcej, twoje różne ImageField
są po prostu podklasami FileField
, który ma max_length
domyślnie 100
.
Jak debugować takie problemy w przyszłości?
To nie pomaga nam wiedzieć, który z twoich pól zgłasza błąd w tym przypadku. W tym celu prawdopodobnie ustawiłbym punkt przerwania gdzieś w kodzie, prawdopodobnie tutaj:
File "ebagu/main/models.py" in save
66. super(Post, self).save(*args, **kwargs)
Przez „ustaw punkt przerwania” rozumiem:
Przejdź do wiersza 65 w module wspomnianym powyżej, ebagu/main/models.py
i wpisz i zapisz moduł:import pdb; pdb.set_trace()
(Właściwie mam silną preferencję dla ipdb ja, ale to wymaga Ipythona, który również bardzo lubię...)
Uruchom serwer lokalny i wykonaj kroki, które spowodowały ten problem. W końcu prześlesz formularz i jeśli spojrzysz na konsolę, w której uruchomiłeś serwer, w końcu zostaniesz zrzucony do powłoki dokładnie w wierszu 65. Ta powłoka to powłoka pdb
, która ma inne reguły niż normalna powłoka, ale możesz ocenić swój Post
, który ma zostać zapisany przykład, patrząc na różne pola w samej instancji, self
i uruchomienie kodu Pythona w kontekście wywołania tej metody:
(pdb) len(self.image.path)
Korzystając z tego, ręcznie oceniłbym różne pola i sprawdził, które z nich ma ten naprawdę długi wpis, który blokuje zapis (prawdopodobnie jedno z twoich ImageField
s).
Rozwiązanie z ostrzeżeniami
Alternatywnie możesz po prostu dodać max_length
do wszystkich z nich, ale pamiętaj, że najprawdopodobniej będziesz musiał wykonać migracje bazy danych dla dowolnego ograniczonego pola tekstowego, które zmienisz, ponieważ Twoja baza danych nadal będzie weryfikować długość danych wejściowych ze sposobem zdefiniowania kolumny. Oto dobra odpowiedź StackOverflow dotycząca dokładnie tego problemu
.
Przypis
Dlaczego nie pojawiło się to przed przejściem na Postgresql? Istnieje wiele potencjalnych przyczyn, ale prawdopodobnie ma to związek z konfiguracją poprzedniej bazy danych w porównaniu z konfiguracją bazy danych Postgresql (ręcznie w porównaniu z migracjami Django?).
Może to również mieć związek z tym, czy zmieniłeś miejsce przechowywania tych rzeczy. Czy zmieniłeś MEDIA
ustawienia, więc ścieżki, w których przechowywane są pliki, są znacznie dłuższe?
To, co naprawdę powinieneś robić, to patrzeć bezpośrednio na swoją bazę danych. Otwórz psql
przykład i poproś go o opisanie twoich tabel dla ciebie. Powie ci, które pola są ograniczone do 100 znaków i są to pola, które sprawiają problemy.