annotate in serializer

This commit is contained in:
Kseninia Mikhaylova 2024-08-20 09:28:55 +03:00
parent 93b60444ea
commit e6079daf32
2 changed files with 38 additions and 6 deletions

View File

@ -1,13 +1,26 @@
from rest_framework import serializers
from tmc.models import Territory
from django.db.models import Count
from tmc.models import Territory, CustomTable
from tmc.serializers import TerritorySerializer
from .models import TgItem, TmcField
from .models import TgItem, TmcElement, TmcField
import logging
logger = logging.getLogger("root")
class CustomTableSerializer(serializers.ModelSerializer):
class Meta:
model = CustomTable
fields = ["name"]
class TmcElementSerializer(serializers.Serializer):
tmc__name = serializers.CharField()
count = serializers.IntegerField()
class TgItemSerializer(serializers.ModelSerializer):
class Meta:
model = TgItem
@ -16,16 +29,28 @@ class TgItemSerializer(serializers.ModelSerializer):
class TgStatItemSerializer(serializers.Serializer):
# location = serializers.CharField()
location = serializers.SerializerMethodField()
inv_count = serializers.IntegerField()
# tmc_count = serializers.IntegerField()
tmc = serializers.SerializerMethodField()
def get_location(self, obj):
queryset = Territory.objects.get(id=obj.get('location__parent'))
queryset = Territory.objects.get(id=obj.get("location__parent"))
serializer = TerritorySerializer(queryset)
return serializer.data
def get_tmc(self, obj):
queryset = (
TmcElement.objects.filter(id__in=obj.get("tmc"))
.values("tmc__name")
.annotate(count=Count("id"))
)
logger.info(queryset)
serializer = TmcElementSerializer(queryset, many=True)
return serializer.data
class Meta:
depth = 2

View File

@ -12,9 +12,10 @@ from rest_framework.response import Response
from rest_framework.decorators import action
from django_filters.rest_framework import DjangoFilterBackend
from django.db.models import Count
from django.db.models import Count, Subquery, OuterRef, Value
from django.db.models.functions import Concat
from django.contrib.postgres.aggregates import ArrayAgg
from tmc.models import TerritoryItem, Territory
from .tgbot import TgBot
from .updater import tg_bot_updater_instance
from .models import TgItem, TmcElement, TmcField
@ -133,7 +134,13 @@ class TmcStatViewset(viewsets.ViewSet):
.values("location__parent")
.annotate(
inv_count=Count("location__parent"),
tmc_count=Count("tmc__tmc_id", distinct=True)
)
.annotate(
tmc=ArrayAgg("tmc"),
)
# .values("tmc__tmc_id")
)
logger.info(queryset)
serializer = TgStatItemSerializer(queryset, many=True)
return Response(serializer.data)