有可能实现这个功能与一个单一的django ORM查询?



我正在为电子商务制作商店,类别和客户的汇总报告。基本上,我试图实现这个函数的功能:

from django.db.models import ExpressionWrapper, DecimalField, F, Sum
from .models import Order

def get_report_data(stores, categories, customers):
    result = []
    for store in stores:
        for category in categories:
            for customer in customers:
                total = Order.objects.filter(
                    store=store,
                    orderitem__product__category=category,
                    customer=customer,
                ).aggregate(
                    total=Sum(
                        ExpressionWrapper(
                            F("orderitem__product__price") * F("orderitem__quantity"),
                            output_field=DecimalField(),
                        )
                    )
                )["total"]
                result.append([store, customer, category, total])
        return result

显然,这是有效的穷人,我试图把这个函数变成一个查询。我试过下面的方法,但我知道我错过了很多。

total = (
    Order.objects.filter(
        store__in=stores,
        customer__in=customers,
        orderitem__product__category__in=categories,
    )
    .values("store", "orderitem__product__category")
    .annotate(
        total=Sum(
            ExpressionWrapper(
                F("orderitem__product__price") * F("orderitem__quantity"),
                output_field=DecimalField(),
            )
        )
    )
)

我该怎么做?

非常感谢!

如果使用基于DRF函数的视图,则不需要序列化器。查看文档https://www.django-rest-framework.org/api-guide/views/并尝试使用DRF @api_view decorator作为正常的django视图函数

将以下视图函数替换为您的数据查询,并在Response({})

中作为数据上下文键值传递
@api_view(['GET', 'POST'])
def hello_world(request):
    if request.method == 'POST':
        return Response({"message": "Got some data!", "data": request.data})
    return Response({"message": "Hello, world!"})

最新更新