O PostgreSQL é "fortemente tipado" - ou seja, cada valor em cada consulta tem um tipo específico, definido explicitamente (por exemplo, o tipo de uma coluna em uma tabela) ou implicitamente (por exemplo, os valores inseridos em um
WHERE
> cláusula). Todas as funções e operadores, incluindo =
, devem ser definidos como aceitando tipos específicos - então, por exemplo, existe um operador para VarChar = VarChar
, e um diferente para int = int
. No seu caso, você tem uma coluna que é explicitamente definida como tipo
int
, mas você está comparando com um valor que o PostgreSQL interpretou como tipo text
. O SQLite, por outro lado, é "fracamente tipado" - os valores são tratados livremente como sendo de qualquer tipo que melhor se adapte à ação que está sendo executada. Portanto, em seu banco de dados dev SQLite, a operação
'42' = 42
pode ser calculado muito bem, onde o PostgreSQL precisaria de uma definição específica de VarChar = int
(ou text = int
, text
sendo o tipo para strings ilimitadas no PostgreSQL). Agora, o PostgreSQL irá às vezes seja útil e "transforme" automaticamente seus valores para fazer com que os tipos correspondam a um operador conhecido, mas com mais frequência, como diz a dica, você precisa fazer isso explicitamente. Se você estivesse escrevendo o SQL por conta própria, um caso de tipo explícito poderia se parecer com
WHERE id = CAST('42' AS INT)
(ou WHERE CAST(id AS text) = '42'
). Como você não está, você precisa garantir que a entrada fornecida ao gerador de consulta seja um inteiro real, não apenas uma string que consiste em dígitos. Eu suspeito que isso seja tão simples quanto usar
fields.IntegerField
em vez de fields.CharField
, mas eu realmente não conheço Django, ou mesmo Python, então eu pensei em dar a você o background na esperança de que você possa continuar a partir daí.