Estoy creando una aplicación de blog y construí una template tag para sort posts by likes . La etiqueta de plantilla funciona bien, pero cuando ordeno by likes , muestra elementos duplicados de acuerdo con los me gusta. Quiero decir, si una publicación obtuvo 3 Me gusta, entonces se muestra esa publicación tres veces.
modelos.py
class BlogPost(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) title = models.CharField(max_length=1000) body = models.CharField(max_length=1000) likes = models.ManyToManyField(User, related_name='likes')template_tags.py
from django import template register = template.Library() @register.filter def sort(queryset, order): return queryset.order_by(order)vistas.py
def posts(request): posts = BlogPost.objects.filter(user=request.user) context = {'posts':posts} return render(request, 'posts.html', context)publicaciones.html
{% load template_tags %} {% block content %} {% for post in posts|sort:'likes' %} {{post.title}} {% endfor %} {% endblock content %} También probé usando distint distinct() tanto en template_tags.py como en views.py , pero no tiene ningún efecto en la consulta.
Lo siguiente debería funcionar para obtener el orden que desea de la vista
from django.db.models import Count def posts(request): posts = BlogPost.objects.filter( user=request.user ).annotate( count_likes=Count('likes') ).order_by('count_likes').distinct() context = {'posts':posts} return render(request, 'posts.html', context) Su filtro de sort no es útil cuando necesita ordenar por una anotación. No estoy seguro de que el filtro sea útil en absoluto, el pedido debe hacerse en la vista