【问题标题】:How to return a group by query via Django REST API?如何通过 Django REST API 查询返回组?
【发布时间】:2022-11-10 22:45:05
【问题描述】:

我有一个 Django REST API,当我想从数据库中查询一些数据时,它可以完美运行。 这里我有一个例子:

视图.py

class ProductListAPIView(generics.ListAPIView):
    
    def get_queryset(self):
           
        # Collect data from products table and filter it
        queryset = Product.objects.filter(name="Ferrari", date__lte="2022-08-01") # <- Substitute with line below
     
        return queryset
    
    serializer_class       = ProductSerializer
    authentication_classes = [authentication.SessionAuthentication, authentication.TokenAuthentication]
    permission_classes     = [IsOwnerPermission]

序列化程序.py

from rest_framework import serializers
from insert_data.models import Product

class ProductSerializer(serializers.ModelSerializer):

    class Meta:
        model = Product
        fields = ["name","category","date","price"]

输出是我所期望的,即包含数据库内容的 json 响应。

当我尝试对查询集进行分组以返回产品的平均价格时,就会出现问题。通过在互联网上进行一些研究,我注意到我只需要将 views.py 脚本中的代码行替换为:

Product.objects.filter(name=params['name'], date__lte=query.date).values('name','category').annotate(price_average=Avg('price')).order_by()

我非常有信心这样做,但是 API 返回一个我不知道如何修复的错误:

AttributeError: 'int' object has no attribute 'pk'

我完全不知道这是指什么。您能否提出一种智能且优雅的方法来通过 REST API 进行分组操作后返回产品的平均价格?

【问题讨论】:

    标签: python django api rest django-rest-framework


    【解决方案1】:

    category 是模型的外键吗?我认为在这种情况下问题出在这个领域。

    我相信当您调用.values() 时,您会获得foreignKey-fields 的ID,并且您不能再将该字段作为对象访问。

    所以 REST Framework 正在尝试访问它认为是 Category 实例的属性 pk。

    要解决此问题,您可以创建一个自定义序列化程序,其中category 是一个整数,并且您已经添加了price_average。你必须检查字段类型,我不知道你有什么类型。

    class ProductPriceAverageSerializer(serializers.Serializer):
        category = serializers.IntegerField()
        price_average = serializers.FloatField()
    

    【讨论】:

    • 我不知道你是怎么做到的,但你是个天才!! :) 按照你说的解决了!非常感谢!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 2020-12-30
    • 2014-03-19
    • 2021-07-12
    • 1970-01-01
    • 2022-06-11
    • 2018-10-08
    相关资源
    最近更新 更多