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