Django REST框架如何通过URL携带的ticket_id字段过滤TicketMessage数据
实现方案
调整视图代码
你当前使用的generics.RetrieveAPIView是单条资源查询视图,要返回指定工单的消息列表,需要改为继承generics.ListAPIView,同时重写get_queryset方法实现按URL传入的ticket_id过滤:
class TicketMessageSerializerView(generics.ListAPIView): serializer_class = TicketMessageSerializer def get_queryset(self): # 读取路由传入的ticket_id参数 ticket_id = self.kwargs["ticket_id"] # 过滤返回对应工单的所有关联消息 return TicketMessage.objects.filter(ticket_id=ticket_id)
路由无需修改
现有路由已经正确配置了ticket_id路径参数,直接复用即可:
path('api/tickets/<int:ticket_id>/messages/', views.TicketMessageSerializerView.as_view()),
可选优化(推荐)
如果需要校验对应工单是否存在,不存在时直接返回404,可以调整get_queryset逻辑如下:
from django.shortcuts import get_object_or_404 from .models import Ticket class TicketMessageSerializerView(generics.ListAPIView): serializer_class = TicketMessageSerializer def get_queryset(self): ticket_id = self.kwargs["ticket_id"] # 先校验工单是否存在 get_object_or_404(Ticket, id=ticket_id) return TicketMessage.objects.filter(ticket_id=ticket_id)
内容的提问来源于stack exchange,提问作者Konstantin Skokov
相关产品推荐
相关产品推荐

