PostgreSQL jest "silnie typizowany" - co oznacza, że każda wartość w każdym zapytaniu ma określony typ, zdefiniowany jawnie (np. typ kolumny w tabeli) lub niejawnie (np. wartości wprowadzane do WHERE klauzula). Wszystkie funkcje i operatory, w tym = , muszą być zdefiniowane jako akceptujące określone typy - tak na przykład istnieje operator dla VarChar = VarChar i inny dla int = int .
W twoim przypadku masz kolumnę, która jest wyraźnie zdefiniowana jako typ int , ale porównujesz go z wartością, którą PostgreSQL zinterpretował jako typ text .
Z drugiej strony SQLite jest "słabo wpisany" - wartości są swobodnie traktowane jako dowolnego typu, który najlepiej pasuje do wykonywanej akcji. Tak więc w twojej dev SQLite bazie danych operacja '42' = 42 można obliczyć dobrze, gdzie PostgreSQL wymagałby określonej definicji VarChar = int (lub text = int , text jest typem dla nieograniczonych ciągów w PostgreSQL).
Teraz PostgreSQL czasami bądź pomocny i automatycznie „rzucaj” swoje wartości, aby typy pasowały do znanego operatora, ale częściej, jak mówi podpowiedź, musisz to zrobić wprost. Jeśli sam piszesz SQL, jawny typ wielkości liter może wyglądać tak:WHERE id = CAST('42' AS INT) (lub WHERE CAST(id AS text) = '42' ).
Ponieważ tak nie jest, musisz upewnić się, że dane wejściowe, które podajesz do generatora zapytań, jest rzeczywistą liczbą całkowitą, a nie tylko łańcuchem, który składa się z cyfr. Podejrzewam, że jest to tak proste, jak użycie fields.IntegerField zamiast fields.CharField , ale tak naprawdę nie znam Django ani nawet Pythona, więc pomyślałem, że przedstawię ci tło w nadziei, że możesz to stamtąd wyciągnąć.