PostgreSQL är "starkt typat" - det vill säga att varje värde i varje fråga har en viss typ, antingen definierad explicit (t.ex. typen av en kolumn i en tabell) eller implicit (t.ex. de värden som matas in i en WHERE
klausul). Alla funktioner och operatorer, inklusive =
, måste definieras som att acceptera specifika typer - så det finns till exempel en operator för VarChar =VarChar
, och en annan för int =int
.
I ditt fall har du en kolumn som uttryckligen definieras som typ int
, men du jämför det med ett värde som PostgreSQL har tolkat som typ text
.
SQLite, å andra sidan, är "svagt typad" - värden behandlas fritt som att de är av den typ som bäst passar den åtgärd som utförs. Så i din dev SQLite-databas operationen '42' =42
kan beräknas bra, där PostgreSQL skulle behöva en specifik definition av VarChar =int
(eller text =int
, text
är typen för obundna strängar i PostgreSQL).
Nu kommer PostgreSQL ibland vara hjälpsam och automatiskt "casta" dina värden för att få typerna att matcha en känd operator, men oftare, som tipset säger, måste du göra det explicit. Om du skrev SQL själv skulle ett explicit typfall se ut som WHERE id =CAST('42' AS INT)
(eller WHERE CAST(id AS text) ='42'
).
Eftersom du inte är det, måste du se till att inmatningen du ger till frågegeneratorn är ett verkligt heltal, inte bara en sträng som råkar bestå av siffror. Jag misstänker att detta är så enkelt som att använda fields.IntegerField
snarare än fields.CharField
, men jag känner faktiskt inte till Django, eller ens Python, så jag tänkte ge dig bakgrunden i hopp om att du kan ta den därifrån.