如何在通用API视图中通过order_id与producer_id获取Trade数据
问题分析与解决方案
你的代码存在几个关键问题导致无法实现需求,以下是具体修复步骤:
1. 核心逻辑修正
当前SingleProducerTradeAPIView的list方法错误地过滤了consumer_id=user,与你需要的producer_id筛选逻辑不符;同时filter()方法不会抛出Trade.DoesNotExist异常(仅get()方法会触发),所以try-except块完全无效。
2. 分场景实现需求
根据业务逻辑,分两种常见场景处理:
场景一:当前登录用户作为生产者,获取指定订单下的交易数据
修改视图代码,贴合DRF规范实现:
from rest_framework import status from rest_framework.response import Response from rest_framework.generics import ListCreateAPIView from .models import Trade from .serializers import TradeSerializer from rest_framework import permissions class SingleProducerTradeAPIView(ListCreateAPIView): serializer_class = TradeSerializer permission_classes = (permissions.IsAuthenticated,) def get_queryset(self): # 从URL参数提取order_id order_id = self.kwargs.get('order_id') # 过滤当前用户为生产者、且归属指定订单的交易数据 return Trade.objects.filter(order_id=order_id, producer=self.request.user) def list(self, request, *args, **kwargs): queryset = self.get_queryset() if not queryset.exists(): return Response({'message': '未找到对应交易数据'}, status=status.HTTP_404_NOT_FOUND) serializer = self.get_serializer(queryset, many=True) return Response(serializer.data) def perform_create(self, serializer): # 生产者创建交易时,自动关联当前用户与URL中的订单ID order_id = self.kwargs.get('order_id') serializer.save(producer=self.request.user, order_id=order_id)
场景二:URL传入producer_id,获取指定订单+指定生产者的交易数据
先修改URL配置,新增producer_id参数:
path('<str:order_id>/producers/<str:producer_id>/', SingleProducerTradeAPIView.as_view(), name="single-producer-trade" ),
再调整视图逻辑:
class SingleProducerTradeAPIView(ListCreateAPIView): serializer_class = TradeSerializer permission_classes = (permissions.IsAuthenticated,) def get_queryset(self): order_id = self.kwargs.get('order_id') producer_id = self.kwargs.get('producer_id') # 按传入的两个参数精准过滤交易数据 return Trade.objects.filter(order_id=order_id, producer_id=producer_id) def list(self, request, *args, **kwargs): queryset = self.get_queryset() if not queryset.exists(): return Response({'message': '未找到对应交易数据'}, status=status.HTTP_404_NOT_FOUND) serializer = self.get_serializer(queryset, many=True) return Response(serializer.data)
3. 序列化器优化(可选)
显式指定只读字段,避免前端传入无效值:
class TradeSerializer(serializers.ModelSerializer): class Meta: model = Trade fields = ( 'id', 'order_id', 'startTime', 'stopTime', 'price', 'consumer_id', 'producer_id', 'location', 'energyQuantity' ) read_only_fields = ('id', 'startTime', 'stopTime')
4. 额外建议
- 若需确保
order_id对应订单真实存在,可在get_queryset中先查询Order模型,不存在则直接返回404 - 使用DRF的
Response替代JsonResponse,自动适配内容协商,更符合REST API标准
内容的提问来源于stack exchange,提问作者Melody
相关产品推荐
相关产品推荐

