Перебор вложенных словарей в Django
Я пробую реализацию. Хотя я разобрался в логике, у меня возникают проблемы с ее программным представлением. Мне нужна ваша помощь или руководство.
Ниже приведено подробное объяснение моего кода и того, чего я пытаюсь достичь, пожалуйста, извините меня, так как это будет долгое чтение.
Что я хочу достичь
Я хочу создать конечную точку - /order/tradeadvisor/{{producer_order_id}}, так что если конечная точка достигнута, то она должна сначала записать producer_order_id в переменную, затем она должна перейти к модели Order и пройтись по ней, извлекая все order_id, user_id с user_type=1.
После этого он должен теперь создать одну запись, в которой каприз пользователя будет равен цене производителя (где производитель является зарегистрированным пользователем), а необходимый пользователю объем двигателя будет равен излишку производителя, а затем сохранить эту запись в таблице Trade.
Что я сделал
User.model:
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
Views.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']) object is not subscriptable
Просто используйте consumer
как экземпляр User
, т.е.:
if consumer.is_trading:
# instead of
if consumer['user_id']['is_trading']
и позже вы захотите проверить Order
, а не User
. Дело не в знании Django, здесь все почти чисто питоновское.
PS. пожалуйста, не задавайте поле ForeignKey
с _id
. Это очень вводит в заблуждение других разработчиков. Я только что потерял 5 минут, потому что не понял этого.