PostgreSQL adalah "sangat diketik" - yaitu, setiap nilai dalam setiap kueri memiliki tipe tertentu, baik yang didefinisikan secara eksplisit (mis. tipe kolom dalam tabel) atau secara implisit (mis. nilai dimasukkan ke dalam WHERE
ayat). Semua fungsi dan operator, termasuk =
, harus didefinisikan sebagai menerima tipe tertentu - jadi, misalnya ada operator untuk VarChar = VarChar
, dan yang berbeda untuk int = int
.
Dalam kasus Anda, Anda memiliki kolom yang secara eksplisit didefinisikan sebagai tipe int
, tetapi Anda membandingkannya dengan nilai yang ditafsirkan oleh PostgreSQL sebagai tipe text
.
SQLite, di sisi lain, "diketik dengan lemah" - nilai diperlakukan secara bebas sebagai jenis apa pun yang paling sesuai dengan tindakan yang dilakukan. Jadi dalam database dev SQLite Anda operasi '42' = 42
dapat dihitung dengan baik, di mana PostgreSQL memerlukan definisi spesifik VarChar = int
(atau text = int
, text
menjadi tipe untuk string tak terbatas di PostgreSQL).
Sekarang, PostgreSQL akan kadang membantu dan secara otomatis "menyalurkan" nilai Anda untuk membuat tipenya cocok dengan operator yang dikenal, tetapi lebih sering, seperti yang dikatakan petunjuknya, Anda perlu melakukannya secara eksplisit. Jika Anda menulis SQL sendiri, tipe kasus eksplisit bisa terlihat seperti WHERE id = CAST('42' AS INT)
(atau WHERE CAST(id AS text) = '42'
).
Karena tidak, Anda perlu memastikan bahwa input yang Anda berikan ke pembuat kueri adalah bilangan bulat yang sebenarnya, bukan hanya string yang kebetulan terdiri dari angka. Saya menduga ini sesederhana menggunakan fields.IntegerField
daripada fields.CharField
, tapi saya sebenarnya tidak tahu Django, atau bahkan Python, jadi saya pikir saya akan memberi Anda latar belakang dengan harapan Anda bisa mengambilnya dari sana.