【问题标题】:Is there a way I can get a list of all the items with balance variable in django有没有办法我可以在 django 中获取所有带有 balance 变量的项目的列表
【发布时间】:2022-11-02 05:22:47
【问题描述】:

我创建了一个由我的反应前端调用的 API。所以问题是我有一个视图集,它显示了数据库中所有客户的列表,效果很好。我还创建了一个显示单个客户详细信息和购买的所有订单的检索方法。在这个检索方法中,我有一个显示客户余额的变量。我的问题是,有没有一种方法可以获得余额大于 0 且小于 0 的所有客户的列表

这是我的观点

class CustomerViewSet(viewsets.ViewSet):
    authentication_classes = [JWTAuthentication]
    permission_classes = [IsAuthenticated]

    def list(self, request):
        customer = Customer.objects.all()
        serializer = CustomerSerializer(customer, many=True, context={"request": request})
        response_dict = {"error": False, "message": "All Customers List Data", "data": serializer.data}
        return Response(response_dict)

    def create(self, request):
        try:
            serializer = CustomerSerializer(data=request.data, context={"request": request})
            serializer.is_valid(raise_exception=True)
            serializer.save()
            dict_response = {"error": False, "message": "Customer Data Stored Successfully"}
        except:
            dict_response = {"error": True, "message": "Phone Number Exists In Database, Fill All Fields"}

        return Response(dict_response)

    def retrieve(self, request, pk=None):
        queryset = Customer.objects.all()
        customer = get_object_or_404(queryset, pk=pk)
        serializer = CustomerSerializer(customer, context={"request": request})

        serializer_data = serializer.data
        # Accessing All the Orders Details of Current Customer
        orders_details = Orders.objects.filter(customer_id=serializer_data["id"]).order_by('-id')
        orders_details_serializers = OrdersSerializer(orders_details, many=True)
        serializer_data["orders"] = orders_details_serializers.data

        # Accessing All Orders of Current Customer
        orders_count = Orders.objects.filter(customer_id=serializer_data["id"])
        orders_count_serializer = OrdersSerializer(orders_count, many=True, context={"request": request})

        # Total orders amount of current customer
        orders_total = Orders.objects.filter(customer_id=serializer_data["id"])
        amount = 0
        discount = 0
        kgs = 0
        for total in orders_total:
            amount = amount + float(total.amount)
            discount = discount + float(total.discount)
            kgs = kgs + float(total.kgs)

        serializer_data1 = serializer.data
        # Accessing All the Payment Details of Current Customer
        payments_details = Payments.objects.filter(customer_id=serializer_data1["id"]).order_by('-id')
        payments_details_serializers = PaymentsSerializer(payments_details, many=True)
        serializer_data["payments"] = payments_details_serializers.data

        serializer_data2 = serializer_data
        payment_count = Payments.objects.filter(customer_id=serializer_data2["id"])
        payment_count_serializer = PaymentsSerializer(payment_count, many=True, context={"request": request})

        # Total Payment of current customer
        payment_total = Payments.objects.filter(customer_id=serializer_data2["id"])
        t_amount = 0
        for balance in payment_total:
            t_amount = t_amount + float(balance.payment)

        balance = amount - t_amount

        dict_response = {"error": False, "message": "Single Data Fetch",
                         "data": serializer_data,
                         "payment": len(payment_count_serializer.data),
                         "buy_total": amount,
                         "payed_total": t_amount,
                         "balance": balance,
                         "kgs": kgs,
                         "discount": discount,
                         "orders_count": len(orders_count_serializer.data)}
        return Response(dict_response)

    def update(self, request, pk=None):
        try:
            queryset = Customer.objects.all()
            customer = get_object_or_404(queryset, pk=pk)
            serializer = CustomerSerializer(customer, data=request.data, context={"request": request})
            serializer.is_valid(raise_exception=True)
            serializer.save()
            dict_response = {"error": False, "message": "Customer Data Updated Successfully"}
        except:
            dict_response = {"error": True, "message": "An Error Occurred"}

        return Response(dict_response)

    def destroy(self, request, pk=None):
        queryset = Customer.objects.all()
        customer = get_object_or_404(queryset, pk=pk)
        # serializer = PaymentsSerializer(customer, context={"request": request})
        customer.delete()
        return Response({"error": False, "message": "Customer Deleted"})

关于如何实现这一目标的任何想法或解决方案

【问题讨论】:

    标签: django rest django-rest-framework django-serializer


    【解决方案1】:

    这是您可能喜欢的解决方案

    from django.db.models import Sum
    
    order = Orders.objects.filter(customer_id=serializer_data['id']).aggregate(Sum('amount'))
    total_order_sum = order.get('amount__sum')
    
    payment = Payments.objects.filter(customer_id=serializer_data2["id"])..aggregate(Sum('payment'))
    total_payment_sum = payment.get('payment__sum')
    
    
    balance = float(total_order_sum - total_payment_sum)
    

    【讨论】:

    • 我想你误解了这个问题。假设我的数据库中有 50 个客户,在这 50 个客户中,有 20 个的余额小于 0,考虑到我正在计算单个客户的余额,我如何检索这 20 个客户并列出他们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 2019-10-10
    • 2022-01-09
    相关资源
    最近更新 更多