【问题标题】:Looping through nested dictionary in Django循环遍历 Django 中的嵌套字典
【发布时间】:2022-08-17 01:31:28
【问题描述】:

我正在尝试一个实现。尽管我已经弄清楚了逻辑,但我在以编程方式表示它时遇到了问题。我需要你的帮助或指导。

以下是我的代码的详细解释以及我想要实现的目标,请原谅我,因为这将是一个漫长的阅读。

我想要达到的目标

我想创建一个端点 - /order/tradeadvisor/{{producer_order_id}},这样如果端点被命中,那么它应该首先将 producer_order_id 记录在一个变量中,然后它应该进入 Order 模型并循环通过它获取所有 order_id、user_id 且 user_type=1。

之后它应该,现在产生一个单一的记录,其中用户任性等于生产者最低价格(生产者是登录用户),然后用户需要的能源等于生产者剩余,然后将此记录存储在交易中桌子。

我做了什么

用户模型:

class User(AbstractBaseUser, PermissionsMixin):
    dso = models.ForeignKey(to=Dso,related_name=\'dso\',null=True,on_delete=models.CASCADE)
    name = models.CharField(max_length=70)
    address = models.CharField(max_length=70)
    roleId = models.IntegerField(default=1)
    customerId = models.CharField(max_length=70, blank=False, default=\'\')
    floorPrice = models.DecimalField(max_digits=10, max_length=255, decimal_places=2, null=True)
    capPrice = models.DecimalField(max_digits=10, max_length=255, decimal_places=2, null=True)
    tradeStrategy = models.CharField(max_length=255, null=True)
    username=models.CharField(max_length=255, unique=True, db_index=True)
    email=models.EmailField(max_length=255, unique=True, db_index=True)
    is_verified = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_trading = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    created_at=models.DateTimeField(auto_now_add=True)
    updated_at=models.DateTimeField(auto_now=True)

用户序列化器:

class UserSerializer(serializers.ModelSerializer):
    energy_data = EnergyDataSerializer(read_only=True)
    dso = DsoSerializer(read_only = True)
    class Meta:
        model = User
        fields = (\'id\',
                  \'name\',
                  \'email\',
                  \'address\',
                  \'roleId\',
                  \'is_active\',
                  \'customerId\', 
                  \'dso\',
                  \'floorPrice\',
                  \'capPrice\',
                  \'tradeStrategy\',
                  \'username\',
                  \'is_verified\',
                  \'is_staff\',
                  \'is_trading\',
                  \'created_at\',
                  \'updated_at\',
                  \'energy_data\', //this is a nested dictionary holding data of the energySurplus and energyNeeded 
                  )
        depth = 1

交易序列化器:

class TradeSerializer(serializers.ModelSerializer):
    consumer_id = serializers.PrimaryKeyRelatedField(allow_null=False, queryset=User.objects.all())
    producer_id = serializers.PrimaryKeyRelatedField(allow_null=False, queryset=User.objects.all())
    c_order_id = serializers.PrimaryKeyRelatedField(allow_null=False, queryset=Order.objects.all())
    p_order_id = serializers.PrimaryKeyRelatedField(allow_null=False, queryset=Order.objects.all())
    startTime = serializers.DateTimeField()

    class Meta:
        model = Trade
        fields = (\'id\',
                  \'startTime\',
                  \'stopTime\',
                  \'price\',
                  \'c_order_id\',
                  \'p_order_id\',
                  \'consumer_id\',
                  \'producer_id\',
                  \'producer_location\',
                  \'consumer_location\',
                  \'energyQuantity\',
              )

订购序列化器

class OrderSerializer(serializers.ModelSerializer):
    trades = TradeSerializer(read_only=True, many= True)
    user_id = serializers.PrimaryKeyRelatedField(allow_null=False, queryset=User.objects.all())
    user_type = serializers.IntegerField()
    created_at = serializers.DateTimeField()
    class Meta:
        model = Order
        fields = (\'id\',
                  \'user_id\',
                  \'user_type\',
                  \'trades\',
                  \'created_at\',
                )
        depth = 1

视图.py:

class TradeAdvisor(views.APIView):
    serializer_class = TradeSerializer
    permission_classes = (permissions.IsAuthenticated,)


    def get(self, request,  *args, **kwargs):
        user = self.request.user
        producer_order_id = self.kwargs[\'p_order_id\']
        orders = Order.objects.filter(user_type=1)

        for order in orders:
            consumer = order.user_id
             
            if consumer[\'user_id\'][\'is_trading\']:
                if ((consumer[\'capPrice\'] == user.floorPrice ) and (consumer[\'energy_data\'][\'energyNeeded\'] == user.energy_data[\'energySurplus\'])):
                    date_time = datetime.datetime.now()
                    data ={
                            \"startTime\": date_time,
                            \"stopTime\": \"\",
                            \"price\": user.flooPrice,
                            \"c_order_id\": order.id,
                            \"p_order_id\": producer_order_id,
                            \"consumer_id\": consumer,
                            \"producer_id\": user,
                            \"producer_location\": user.address,
                            \"consumer_location\": consumer[\'address\'],
                            \"energyQuantity\": user.energy_data[\'energySurplus\']
                    }
                    serializer = self.serializer_class(data=data)
                    serializer.save()
                else:
                    return Response({\'error\': \'No active consumers\'}, status = status.HTTP_400_BAD_REQUEST)
            else:
                return Response({\'error\': \'No active consumers\'}, status = status.HTTP_400_BAD_REQUEST)

所以这就是我尝试过的,我很确定是错的,而且我确实得到了一个错误\'int\'(consumer[\'user_id\'][\'is_trading\']) 对象不可下标

    标签: python django django-models


    【解决方案1】:

    在这里,您正在设置 id

    consumer = order.user_id
    

    我想你的意思是这样的:

    consumer = User.objects.get(id=order.user_id)
    

    之后只需使用consumer 作为User 实例,即:

    if consumer.is_trading:
    
    # instead of
    if consumer['user_id']['is_trading']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 2019-03-22
      • 2019-01-16
      • 2020-03-04
      • 2014-05-11
      相关资源
      最近更新 更多