Django orm: упорядочивание набора запросов к посту по наибольшему количеству тегов из поиска

Я хочу упорядочить посты по наибольшему количеству тегов в посте

мои модели:

class post(models.Model):
   description = models.Charfield(max_length = 2000)

class tag(models.Model):
    t = models.Charfield(max_length = 100)

class tags(models.Model):
    tag = models.ForeignKey(tag, ...)
    post = models.ForeignKey(post,...)

Я знаю, что django's orm поддерживает много-много полей, я просто создаю свою собственную таблицу, потому что мне так удобнее начинать.

При вводе поиска, например: фиолетовые горные цветы Я хочу запросить сообщения, в которых есть любой из тегов, и упорядочить запрос по сообщениям с наибольшим количеством совпадающих тегов. Я новичок в использовании агрегации в django и понятия не имею, как это структурировать. Есть какие-нибудь рекомендации?

Во-первых, вы должны следовать некоторым стандартам python/Django для именования. Класс модели должен иметь название (Post, Tag, PostTag) и единственное число. Вы можете использовать опцию through для определения собственной модели для m2m:

class post(models.Model):
    description = models.Charfield(max_length = 2000)
    post_tags = models.ManyToManyField(tag, through=tags)

После этого вы можете использовать django m2m, чтобы сделать запрос проще:

from django.db.models import Q, Count
qs = post.objects.annotate(
    num_of_tags=Count('post_tags', filter=Q(post_tags__body__in=search_list)))
).filter(num_of_tags__gt=0).order_by('num_of_tags')
Вернуться на верх