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

Django嵌套字典遍历问题及Trade接口实现报错求助

问题分析与解决

错误原因

报错'int' object is not subscriptable出现在consumer['user_id']['is_trading'],核心原因是:你从Order查询中拿到的consumer['user_id']是整数类型的用户ID值,而非User模型实例,所以无法通过下标['is_trading']访问用户属性。

解决方案

要访问用户的is_trading等属性,必须先获取对应的User实例,推荐两种实现方式:

方式1:查询Order时关联User表(推荐,避免N+1查询)

假设你的Order模型通过外键user关联User模型,查询时用select_related预加载关联的User数据,直接通过对象属性访问:

def get(self, request, producer_order_id):
    # 记录producer_order_id
    # 获取当前登录的生产者用户
    producer = request.user
    # 查询user_type=1的订单,同时关联User表
    consumer_orders = Order.objects.filter(user_type=1).select_related('user').all()
    
    for order in consumer_orders:
        # 直接访问User实例的属性
        if not order.user.is_trading:
            continue
        # 匹配价格与能量条件
        if order.user.capPrice == producer.floorPrice and order.energyNeeded == producer.energySurplus:
            # 创建Trade记录
            Trade.objects.create(
                producer_order_id=producer_order_id,
                consumer_order_id=order.order_id,
                producer_user=producer,
                consumer_user=order.user,
                # 补充Trade模型需要的其他字段
            )
    # 返回响应
    return Response({"status": "success"})

方式2:循环中单独查询User实例

如果暂时无法修改Order查询逻辑,可以在循环里根据user_id查询User实例:

def get(self, request, producer_order_id):
    producer = request.user
    consumer_orders = Order.objects.filter(user_type=1).values('order_id', 'user_id', 'energyNeeded')
    
    for order in consumer_orders:
        try:
            consumer_user = User.objects.get(id=order['user_id'])
        except User.DoesNotExist:
            continue
        if not consumer_user.is_trading:
            continue
        if consumer_user.capPrice == producer.floorPrice and order['energyNeeded'] == producer.energySurplus:
            Trade.objects.create(
                producer_order_id=producer_order_id,
                consumer_order_id=order['order_id'],
                producer_user_id=producer.id,
                consumer_user_id=order['user_id'],
                # 补充其他字段
            )
    return Response({"status": "success"})

注意事项

  • 确认Order模型中存在关联User的外键字段(如user = models.ForeignKey(User, on_delete=models.CASCADE))
  • 方式1的select_related仅适用于一对一/外键关联,若为多对多需用prefetch_related
  • 避免在循环内频繁查询数据库(方式2存在此问题),优先用方式1优化性能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:24:23