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')