【发布时间】: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