Como usar order_by() y distinct() en Django
Normalmente cuando se trata de filtrar objetos sin duplicados en Django, .distinct () se coloca al final de una lista de objetos. Esto se deshace de todos los duplicados y deja un conjunto de sólo los objetos únicos. También puede pasar nombres de campo como parámetros para dejar sólo los objetos con valores distintos en ese campo particular de la base de datos.Esto funciona perfectamente bien hasta que intentas ordenar estos resultados también. Al principio pensé que podría intentar añadir .order_by () de la siguiente manera:
sets = CheckinSets.objects.filter(contact_info=info, date_arrived=None).distinct().order_by('-date_created')
Sin embargo, después de intentar esto, usted encontrará que .order_by() y .distinct () no funcionan bien juntos y producen un conflicto en los resultados obtenidos, así que esencialmente .order_by () anula el .distinct() y se siguen devolviendo objetos duplicados.
Solución
La solución, sin embargo, es bastante simple. El código permanece exactamente lo mismo que antes, y sólo tiene que cambiar .distinct() para .annotate() de la siguiente manera:sets = CheckinSets.objects.filter(contact_info=info, date_arrived=None).annotate().order_by('-date_created')
Bastante simple y fácil de solucionar, ahora usted puede obtener los resultados deseados; un conjunto de objetos ordenados con valores distintos. Si lo desea, puede obtener más información sobre .annotate() en la API de Django.
No hay comentarios:
Publicar un comentario