Тег шаблона показывает дублирующиеся элементы в шаблоне

Я создаю приложение для блога и создал template tag от sort posts by likes. Шаблонный тег работает нормально, но когда я сортирую by likes, то он показывает дублирующиеся элементы в соответствии с лайками. То есть, если пост получил 3 лайка, то он показывает этот пост повторно.

models.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)

views.py

def posts(request):
    posts = BlogPost.objects.filter(user=request.user)

    context = {'posts':posts}
    return render(request, 'posts.html', context)

posts.html


{% load template_tags %}

{% for post in posts|sort:'likes' %}

{{post.title}}

{% endfor %}

Я также пробовал использовать distinct() в обоих template_tags.py и views.py, но это не влияет на запрос.

Любая помощь будет очень признательна. Спасибо

Следующее должно работать для получения желаемого упорядочивания из представления

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)

Ваш фильтр sort бесполезен, когда вам нужно отсортировать по аннотации. Я не уверен, что фильтр вообще полезен, упорядочивание должно выполняться в представлении

Вернуться на верх