Фильтровать объект и упорядочивать по количеству совпавших фильтров

У меня есть объекты

>>> Post.objects.create(name='First post', tags=['tutorial', 'django', 'example'])
>>> Post.objects.create(name='Second post', tags=['thoughts'])
>>> Post.objects.create(name='Third post', tags=['thoughts', 'django', 'example'])

Я хочу отфильтровать объекты Post, чтобы они соответствовали серии тегов:

>>> filtered = Post.objects.filter(tags__in=['thoughts', 'django', 'example'])

Есть ли способ упорядочить эти результаты по количеству фильтров, которым они соответствовали?

Желаемый результат:

>>> filtered[0]
<Post: Third post>
>>> filtered[1] 
<Post: First post>
>>> filtered[2] 
<Post: Second post>

Фактический результат:

>>> filtered[0]
<Post: First post>
>>> filtered[1] 
<Post: Second post>
>>> filtered[2] 
<Post: Third post>

Я использую Django 3.2.14

Вы можете аннотировать количество отфильтрованных Tag объектов:

from django.db.models import Count

filtered = Post.objects.filter(
    tags__in=['thoughts', 'django', 'example']
).alias(
    ntags=Count('tags')
).order_by('-ntags')
Вернуться на верх