Как вернуть группу по запросу через 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()