from rest_framework import serializers from django.db.models import Count from tmc.models import Territory, CustomTable from tmc.serializers import TerritorySerializer 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 TerritorySerializer(serializers.Serializer): id = serializers.IntegerField() name = serializers.CharField() count = serializers.IntegerField(required=False) class TgItemSerializer(serializers.ModelSerializer): class Meta: model = TgItem fields = "__all__" depth = 3 class TgStatItemSerializer(serializers.Serializer): location = serializers.SerializerMethodField(required=False) inv_count = serializers.IntegerField() tmc = serializers.SerializerMethodField() def get_location(self, obj): if not obj.get("location__parent"): return None if isinstance(obj.get("location__parent"), list): location_parent_ids = obj.get("location__parent") queryset = Territory.objects.filter(id__in=obj.get("location__parent")) for q in queryset: q.count = location_parent_ids.count(q.id) serializer = TerritorySerializer(queryset, many=True) else: 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")) ) serializer = TmcElementSerializer(queryset, many=True) return serializer.data class Meta: depth = 2 class TmcFieldSerializer(serializers.ModelSerializer): class Meta: model = TmcField fields = "__all__"