You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django如何实现按模糊匹配的HashTag分组返回关联Post列表

解决方案

首先修正现有代码的两个基础问题:

  • 模糊查询的字段过滤器拼写错误:hash_tag__icontain 应该是 hash_tag__icontains
  • 多对多字段过滤时,hash_tags__in 接收的参数应该是HashTag实例/主键列表,你之前获取的字典列表不符合要求

完整实现代码

首先你需要先定义Post的序列化器,用来把Post模型实例转换为可返回的JSON结构,你可以在项目里新增serializers.py文件写入以下内容:

from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ['id', 'created', 'updated_at', 'creator_id', 'body']
        # 可根据你的业务需求调整需要返回的Post字段

然后修改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 Post, HashTag
from .serializers import PostSerializer


@swagger_auto_schema(
    method='get',
    operation_description="对HashTag表进行前缀模糊匹配,返回匹配标签下的所有Post,按标签分组"
)
@api_view(['GET'])
def get_search_posts_by_hash_tag(request, input):
    # 1. 查询所有匹配的HashTag,同时预加载关联的Post,避免N+1查询
    matched_tags = HashTag.objects.filter(
        hash_tag__icontains=input
    ).prefetch_related('post_set')
    
    # 2. 遍历标签组装要求的返回结构
    result = {}
    for tag in matched_tags:
        # 序列化当前标签关联的所有Post
        posts = PostSerializer(tag.post_set.all(), many=True).data
        result[tag.hash_tag] = posts
    
    return Response(result, status=status.HTTP_200_OK)

补充说明

如果你的Post模型关联HashTag的反向查询名称不是默认的post_set,可以替换为你自己定义的related_name值即可。
如果你不需要完整的Post字段,也可以直接用values()方法取出你需要的字段,省略序列化器的定义。

内容的提问来源于stack exchange,提问作者user12314098

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:06:09