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

如何在通用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 12:24:13