Django - Возвращаем дикту постов, сгруппированных по хэш-тегам

Я работаю над функцией поиска, где пользователь может искать Post по Hash_Tag. Например, каждый пост имеет hash_tags, и я хочу, чтобы пользователь мог выполнять частичный поиск по хэш-тегам и чтобы он возвращал результаты. Например, допустим, моя таблица Hash_Tag имеет [goDawgs, godGiven, goGetEm] в качестве хэш-тегов, и пользователь ищет "go", тогда результаты должны возвращать что-то вроде:

{'goDawgs': [list of posts with this hash tag], 'godGiven': [list of posts with this hash tag], 'goGetEm': [list of posts with this hash tag]}

Как вы можете видеть в моем models.py файле ниже, я разобрал хэш-теги и создал внешний ключ для каждого поста. Таким образом, у него будет внешняя ключевая ссылка на хэш-теги, если он находится внутри поста.

Как вернуть дикт хэш-тегов и все посты, содержащие этот хэш-тег?

view.py

from drf_yasg.utils import swagger_auto_schema
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response

from cheers.models import *


@swagger_auto_schema(
    method='get',
    operation_description="icontains search hash_tag table for <input> then retrieves all posts"
                          "with the hash tags"
)
@api_view(['GET'])
def get_search_posts_by_hash_tag(request, input):
    partial_fit_hash_tags_list = list(HashTag.objects.filter(hash_tag__icontain=input).values('hash_tag'))
    filtered_posts = Post.objects.filter(hash_tags__in=partial_fit_hash_tags_list)
    pass

model.py

class Post(models.Model):
    created = models.DateTimeField('Created at', auto_now_add=True)
    updated_at = models.DateTimeField('Last updated at', auto_now=True, blank=True, null=True)
    creator = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name="post_creator")
    body = models.CharField(max_length=POST_MAX_LEN, validators=[MinLengthValidator(POST_MIN_LEN)])
    hash_tags = models.ManyToManyField(HashTag)

class HashTag(models.Model):
    hash_tag = models.CharField(max_length=HASH_TAG_MAX_LEN, primary_key=True, validators=[
        MinLengthValidator(HASH_TAG_MIN_LEN)])
    # No update added, because cannot be edited. Can only be added and deleted

почему бы не сделать что-то вроде этого

@api_view(['GET'])
def get_search_posts_by_hash_tag(request, input):
    partial_fit_hash_tags_list = list(HashTag.objects.filter(hash_tag__icontain=input))
    data = {}
    for tag in list(set(partial_fit_hash_tags_list)):
        filtered_posts = Post.objects.filter(hash_tags__in=[tag,])
        data[tag.hash_tag] = list(filtered_posts)

    pass
Вернуться на верх