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

