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 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 tmc.serializers import TerritorySerializer
from .models import TgItem, TmcField from .models import TgItem, TmcElement, TmcField
import logging import logging
logger = logging.getLogger("root") 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 TgItemSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = TgItem model = TgItem
@ -16,16 +29,28 @@ class TgItemSerializer(serializers.ModelSerializer):
class TgStatItemSerializer(serializers.Serializer): class TgStatItemSerializer(serializers.Serializer):
# location = serializers.CharField()
location = serializers.SerializerMethodField() location = serializers.SerializerMethodField()
inv_count = serializers.IntegerField() inv_count = serializers.IntegerField()
# tmc_count = serializers.IntegerField()
tmc = serializers.SerializerMethodField()
def get_location(self, obj): 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) serializer = TerritorySerializer(queryset)
return serializer.data 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: class Meta:
depth = 2 depth = 2

View File

@ -12,9 +12,10 @@ from rest_framework.response import Response
from rest_framework.decorators import action from rest_framework.decorators import action
from django_filters.rest_framework import DjangoFilterBackend 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 .tgbot import TgBot
from .updater import tg_bot_updater_instance from .updater import tg_bot_updater_instance
from .models import TgItem, TmcElement, TmcField from .models import TgItem, TmcElement, TmcField
@ -133,7 +134,13 @@ class TmcStatViewset(viewsets.ViewSet):
.values("location__parent") .values("location__parent")
.annotate( .annotate(
inv_count=Count("location__parent"), 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) serializer = TgStatItemSerializer(queryset, many=True)
return Response(serializer.data) return Response(serializer.data)