Как вернуть группу по запросу через Django REST API?

У меня есть Django REST API, который отлично работает, когда я хочу запросить некоторые данные из базы данных. Вот пример:

views.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]

serializers.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'

Я совершенно не понимаю, к чему это относится. Не могли бы вы предложить умный и элегантный способ вернуть среднюю цену товара после операции group by через REST API?

Является ли category ForeignKey для модели? Я думаю, что в таком случае проблема связана с этим полем.

Я считаю, что при вызове .values() вы получаете id foreignKey-поля и больше не можете получить доступ к этому полю как к объекту.

Итак, REST Framework пытается получить доступ к свойству pk на том, что, по его мнению, является экземпляром Category.

Чтобы исправить это, вы можете создать пользовательский сериализатор, в котором category будет целым числом, а вы добавили price_average. Вы должны проверить типы полей, я не знаю, какие типы у вас есть.

class ProductPriceAverageSerializer(serializers.Serializer):
    category = serializers.IntegerField()
    price_average = serializers.FloatField()
Вернуться на верх