class TransactionHistoryListSerializer(serializers.BaseSerializer):
class Meta:
model = CustomerVisit
def to_representation(self, instance):
price = 0
package_price = booking_models.TestBooking.objects.filter(customer_visit=instance).values_list(
"package__test__test_mrp", flat=True
)[0]
for price in package_price:
pass
return {
"visit_id": instance.id,
"customer_name": {
"salutation": instance.customer.salutation,
"first_name": instance.customer.first_name,
"middle_name": instance.customer.middle_name,
"last_name": instance.customer.last_name,
},
"dob": instance.customer.date_of_birth,
"amount": sum([k.amount for k in booking_models.TestBooking.objects.filter(customer_visit=instance)])
+ (price if price else 0),
"discount": sum([k.discount for k in booking_models.TestBooking.objects.filter(customer_visit=instance)]),
"paid_amount": sum([k.amount for k in payment_models.Payment.objects.filter(customer_visit=instance)]),
}这里,tes_mrp是浮动类型。我搜索并找到解决方案,使用列表理解,但仍然没有工作。我尝试了[[price] for price in package_price],for price in package_price: a = list(str(price)),但是仍然不能迭代获取浮点对象。我肯定做错了什么。有人能帮忙吗。谢谢!!
发布于 2022-01-14 14:04:40
是在这一行中引起的,在package_price中是为了价格:
好吧,那是因为你在做.values_list(..., flat=True),它返回一个列表,然后用[0]索引它,所以你得到了第一个值。因此,package_price确实是一个浮点数,正如错误所述,您不能在单个浮点数上迭代。
因此,这个特定的比特只需去掉那个[0]就可以修复。
您的代码可以简化为不重复查询和使用Django的聚合:
def to_representation(self, instance):
bookings = booking_models.TestBooking.objects.filter(customer_visit=instance)
payments = payment_models.Payment.objects.filter(customer_visit=instance)
package_price = bookings.values_list("package__test__test_mrp", flat=True).first()
booking_amounts = bookings.aggregate(
price_sum=Sum("amount"),
discount_sum=Sum("discount"),
)
payment_amounts = payments.aggregate(
payment_sum=Sum("amount"),
)
return {
"visit_id": instance.id,
"customer_name": {
"salutation": instance.customer.salutation,
"first_name": instance.customer.first_name,
"middle_name": instance.customer.middle_name,
"last_name": instance.customer.last_name,
},
"dob": instance.customer.date_of_birth,
"amount": (booking_amounts.get("price_sum") or 0) + package_price,
"discount": booking_amounts.get("discount_sum") or 0,
"paid_amount": payment_amounts.get("payment_sum") or 0,
}https://stackoverflow.com/questions/70711653
复制相似问题