Estou lutando para entender o ORM do Django. O que eu quero fazer é obter uma lista de valores distintos dentro de um campo da minha tabela .... o equivalente a um dos seguintes:
SELECT DISTINCT myfieldname FROM mytable
(ou alternativamente)
SELECT myfieldname FROM mytable GROUP BY myfieldname
Eu, pelo menos, gostaria de fazer isso do jeito Django antes de recorrer ao sql bruto. Por exemplo, com uma mesa:
id, rua, cidade
1, Main Street, Hull
2, Outra Rua, Casco
3, Bibble Way, Leicester
4, Outra Maneira, Leicester
5, High Street, Londidium
Eu gostaria de obter:
Hull, Leicester, Londidium.
values_list
na verdade não retorna uma lista. Ele retorna algo como um queryset. Achei útil sempre usar list () em torno de chamadas de values_list.values_list
retorna ValuesListQuerySet, que é um iterador. A conversão para lista pode ser útil, mas também pode afetar o desempenho quando todas as linhas precisam ser avaliadas de uma vez, especialmente com grandes conjuntos de dados.Meta: ordering = ()
"recurso" de django orm eobjects.distinct()
vs.objects.ordering().distinct()
nos causou horas de confusão. Deve haver um adesivo de advertência de segurança do consumidor nesse produto;) Podemos instituir uma política de atributo de não pedido Meta para evitar arranhões de cabeça no futuro.Meta
classeordering
e resolver problemasdistinct
usandoorder_by()
sem parâmetros. Está nos documentos da API QuerySet emorder_by()
" Se você não quiser que nenhuma ordem seja aplicada a uma consulta, nem mesmo a ordem padrão, chameorder_by()
sem parâmetros. "Além da resposta ainda muito relevante de jujule , acho muito importante também estar ciente das implicações de
order_by()
ondistinct("field_name")
question. Este é, no entanto, um recurso exclusivo do Postgres!Se você estiver usando o Postgres e definir um nome de campo para o qual a consulta deve ser diferente, será
order_by()
necessário começar com o mesmo nome de campo (ou nomes de campo) na mesma sequência (pode haver mais campos depois).Se você quiser, por exemplo, extrair uma lista de cidades nas quais você conhece lojas, o exemplo de jujule teria que ser adaptado para isto:
fonte
Por exemplo:
fonte