Dúvidas ao utilizar order_by e filter com palavras que levam acentos

575 views
Skip to first unread message

Natalia

unread,
Jul 3, 2012, 11:18:52 AM7/3/12
to Django Brasil
Boa tarde, estou tentando ordenar uma lista porém ela não está
apresentando como eu gostaria:

ex: Pessoas.objects.all().order_by('nome')

1- Ana
2- Leticia
3- Ricardo
4- Átila

Quando tem nome com acento, o nome aparece no final da lista, como
resolvo isso?

E a outra dúvida, quando eu mando filtrar
Pessoas.objects.filter(nome='atila') o django nao me retorna nada,
gostaria que retornasse mesmo nao colocando acento.

Alguém pode me tirar essa dúvida?

Ernesto Guevara

unread,
Jul 5, 2012, 5:20:19 PM7/5/12
to django...@googlegroups.com
Olá Natália!

A ordenação pode ser feita de forma crescente:

 .order_by('nome')

Ou decrescente:

.order_by('-nome')

https://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by

Em relação à pesquisa pelo nome em si, vc pode usar o icontains:

https://docs.djangoproject.com/en/dev/ref/models/querysets/#icontains

nome__icontains='atila'

O contains é case-sensitive, se informar td minúsculo ele só vai retornar nomes com td minúsculo, mas se quiser nomes que tenham letra minúscula e maiúscula use o icontains, é o mais indicado para pesquisa.

[]s




--
Django Brasil em Google Groups <http://groups.google.com.br/group/django-brasil>
Associe-se à Python Brasil e suporte nossa comunidade! <http://associacao.python.org.br/>

Joe Rabelo

unread,
Oct 16, 2019, 12:37:37 PM10/16/19
to django...@googlegroups.com
Boa tarde pessoal,

Alguém poderia ajudar. Estou com a mesma dúvida da Natalia em relação da ordenação com acentuação. 

Tenho o banco de dados em UTF-8.

Como ordenar ignorando a acentuação?

Grato desde já,
Abraços

 
--
Abraços,
Joe Rabelo

Rafael Henter

unread,
Oct 16, 2019, 3:06:22 PM10/16/19
to django...@googlegroups.com
Fala Joe,

O Django não tem uma forma nativa de você apresentar estes dados. Penso que a forma mais elegante seja você criar um Manager ou adicionar um metodo ao ja existente ordenando o seu queryset. 

Ex:

import unicodedata



def remove_accents(input_str):
nfkd_form = unicodedata.normalize('NFKD', input_str)
return u"".join([c for c in nfkd_form if not unicodedata.combining(c)])

class PessoaManager(UserManager):
def get_ordered_by_name(self):
queryset = super().get_queryset()
return sorted(queryset, key=lambda i: remove_accents(i.first_name))
No seu modelo de Pessoa vc adiciona o manager customizado

class Pessoa(models.Model):
...
objects = PessoaManager()

Espero ter ajudado,


Abraço,

Rafael Henter

--
Você recebeu essa mensagem porque está inscrito no grupo "Django Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para django-brasi...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/django-brasil/CAEVrU9k9oKNP01%2B2iV_5iks1eOqq9z-EQCcC1c6rtVZAodFkyQ%40mail.gmail.com.

Rafael Henter

unread,
Oct 17, 2019, 9:41:22 AM10/17/19
to django...@googlegroups.com

Esqueci de mensionar como usar o manager, caso ainda não tenha feito utilizado antes. Ex:

In [3]: Pessoa.objects.get_ordered_by_name()
Out[3]:
[<Pessoa: AAe Silva>,
<Pessoa: Admin Silva>,
<Pessoa: Aécio >,
<Pessoa: Ana Silva>,
<Pessoa: Átila Silva>,
<Pessoa: Breno Silva>,
<Pessoa: Ricardo Silva>]

Abs,

Rafael Henter

Ezequiel Bertti

unread,
Oct 17, 2019, 1:13:50 PM10/17/19
to django...@googlegroups.com
Qual é o banco que vc está utilizando?

On Wed, Oct 16, 2019 at 1:37 PM Joe Rabelo <joer...@gmail.com> wrote:
--
Você recebeu essa mensagem porque está inscrito no grupo "Django Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para django-brasi...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/django-brasil/CAEVrU9k9oKNP01%2B2iV_5iks1eOqq9z-EQCcC1c6rtVZAodFkyQ%40mail.gmail.com.


--

Joe Rabelo

unread,
Oct 17, 2019, 10:42:12 PM10/17/19
to django...@googlegroups.com
Obrigado Henter!

Estou utilizando o PostgreSQL.




--
Abraços,
Joe Rabelo

Ezequiel Bertti

unread,
Oct 18, 2019, 10:09:10 AM10/18/19
to django...@googlegroups.com
O problema da solução proposta para ordenar, está fazendo isso no processo do django, e não no banco, se sua coleção for muito grande, acabará consumindo muita memoria e irá acabar com a possibilidade de paginação.

se vc usa o postgresql, vc pode tentar usar esse cara aqui:


não consigo testar aqui, mas acho q funcionaria assim:

Pessoa.objects.all().order_by('nome__unaccent') 


Reply all
Reply to author
Forward
0 new messages