Как упорядочить набор запросов по количеству пересекающихся тегов с конкретным объектом? - PullRequest
1 голос
/ 09 октября 2019

У меня есть объект Post с некоторыми тегами. Мне нужно получить набор запросов других постов, упорядоченных по количеству пересекающихся тегов с конкретным сообщением.

Например, есть 4 сообщения со следующими тегами:

  1. дом сад лето
  2. сад растения
  3. лето дом кондиционирование
  4. игра зимние снежки

Так что, если основной пост - первый, отсортированный набор запросов должен быть:

3, 2, 4

Есть лиспособ сделать это с Django ORM?

1 Ответ

0 голосов
/ 09 октября 2019

Я написал следующую функцию:

class Post(models.Model):
...
    def get_similar_posts(self, n_posts):
        posts_tagged_similarly = Post.objects.filter(tags__in=self.tags.all())
        other_posts = Post.objects.exclude(pk__in=posts_tagged_similarly)
        union = posts_tagged_similarly.exclude(pk=self.pk).annotate(n_tags=models.Count('tags')).\
            union(other_posts.annotate(n_tags=models.Value(0, models.IntegerField()))).order_by('-n_tags', '-published')
    return union[:n_posts]

Это кажется пугающим, но работает!

...