Фильтровать объект и упорядочивать по количеству совпавших фильтров
У меня есть объекты
>>> 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')