Как использовать данные одного вложенного сериализатора в более чем одной переменной родительского сериализатора с помощью одного вызова db в DRF?

Как я могу получить или сохранить где-нибудь данные EmployeeSerializer, чтобы я мог использовать их снова для получения количества активных членов вместо того, чтобы делать новый вызов базы данных для получения количества активных членов?

class ProjectSerailizer(serializers.ModelSerializer):
  members = EmployeeSerializer(many=True)#returns all members of a project
  active_members_count = serializers.SerializerMethodField()# get count of members which are having status active
  class Meta:
    model = Project
    fields = ('id','name','members','active_members_count')
  
  def get_active_members_count(self,obj):
    #How can I omit this extra db call? as i am already having data in members variable from EmployeeSerializer, can i loop over members variable somehow and count the active ones?
    count = obj.members.filter(status='Active').count()
    return count

Вы можете установить queryset в представлении с помощью select_related() и отфильтровать annotate()

django.db.models import Count, Q

queryset = Project.objects.select_related('members').annotate(
    active_members_count = Count('members', filter=Q(members__status = 'Active'))
)

Тогда вы получите active_members_count и другие members поля в ProjectSerailizer без дополнительных обращений к базе данных

Вернуться на верх