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
相关产品推荐
相关产品推荐

