PostgreSQL er "stærkt indtastet" - det vil sige, at hver værdi i hver forespørgsel har en bestemt type, enten defineret eksplicit (f.eks. typen af en kolonne i en tabel) eller implicit (f.eks. de værdier, der indtastes i en WHERE-kode)> klausul). Alle funktioner og operatorer, inklusive
=
, skal defineres som at acceptere specifikke typer - så der er for eksempel en operator for VarChar =VarChar
, og en anden for int =int
.
I dit tilfælde har du en kolonne, der udtrykkeligt er defineret som typen int
, men du sammenligner det med en værdi, som PostgreSQL har fortolket som typen tekst
.
SQLite er på den anden side "svagt indtastet" - værdier behandles frit som værende af den type, der passer bedst til den handling, der udføres. Så i din dev SQLite-database er operationen '42' =42
kan beregnes fint, hvor PostgreSQL ville have brug for en specifik definition af VarChar =int
(eller text =int
, tekst
er typen for ubundne strenge i PostgreSQL).
Nu vil PostgreSQL nogle gange være hjælpsom og automatisk "cast" dine værdier for at få typerne til at matche en kendt operator, men oftere, som tippet siger, skal du gøre det eksplicit. Hvis du selv skrev SQL'en, kunne en eksplicit type case se ud som WHERE id =CAST('42' AS INT)
(eller WHERE CAST(id AS tekst) ='42'
).
Da du ikke er det, skal du sikre dig, at det input, du giver til forespørgselsgeneratoren, er et faktisk heltal, ikke kun en streng, der tilfældigvis består af cifre. Jeg formoder, at dette er så simpelt som at bruge fields.IntegerField
i stedet for fields.CharField
, men jeg kender faktisk ikke Django, eller endda Python, så jeg tænkte, at jeg ville give dig baggrunden i håbet om, at du kan tage den derfra.