Estou curioso para saber se há alguma maneira de fazer uma consulta no Django que não seja um " SELECT * FROM...
" subjacente. Estou tentando fazer um " SELECT DISTINCT columnName FROM ...
" em vez disso.
Especificamente, tenho um modelo que se parece com:
class ProductOrder(models.Model):
Product = models.CharField(max_length=20, promary_key=True)
Category = models.CharField(max_length=30)
Rank = models.IntegerField()
onde o Rank
é uma classificação dentro de a Category
. Eu gostaria de poder iterar em todas as categorias, fazendo alguma operação em cada classificação dentro dessa categoria.
Eu gostaria primeiro de obter uma lista de todas as categorias do sistema e, em seguida, consultar todos os produtos dessa categoria e repetir até que todas as categorias sejam processadas.
Prefiro evitar SQL bruto, mas se tiver que ir lá, tudo bem. Embora eu nunca tenha codificado SQL bruto em Django / Python antes.
Na verdade, é muito simples se você estiver usando PostgreSQL , basta usar
distinct(columns)
( documentação ).Observe que este recurso foi incluído no Django desde 1.4
fonte
can_distinct_on_fields
parece ser apenas Postgresall()
não é necessário aquiAs outras respostas são boas, mas isso é um pouco mais claro, pois fornece apenas os valores como você obteria de uma consulta DISTINCT, sem qualquer sujeira do Django.
ou
E funciona sem PostgreSQL.
Isso é menos eficiente do que usar um .distinct (), presumindo que DISTINCT em seu banco de dados seja mais rápido do que um python
set
, mas é ótimo para mexer no shell.fonte
values_list
não colocaDISTINCT
na consulta sql, então isso traria vários valores se houvesse.O usuário ordena com esse campo e, em seguida, faz distinção.
fonte