0

I have these models:

class Convocacao(models.Model):
    cursos = models.ManyToManyField(Curso)

class RegistroConvocacao(models.Model):
    aluno = models.ForeignKey(Aluno)
    convocacao = models.ForeignKey(Convocacao)
    tipo = models.IntegerField(choices=TiposConvocacao)

class Aluno(models.Model):
    curso = models.ForeignKey(Curso)

Then I get a Convocacao object:

obj = get_object_or_404(Convocacao, pk=pk)

Now, I want to use annotate inside obj.cursos, to sum the tipo of RegistroConvocacao.

Something like:

cursos = obj.cursos.all()
cursos = cursos.annotate(       
    total_ingressantes=obj.registroconvocacao_set.filter(
            aluno__curso__in=obj.cursos, 
            tipo_convocacao=RegistroConvocacao.TIPO_CONVOCACAO_INGRESSANTE
    ).count()
)

But it gives error: TypeError: 'ManyRelatedManager' object is not iterable

I want to do something like:

for curso in obj.cursos.all():
    total = curso.total_ingressantes
    ...
Neto
  • 11
  • 1

1 Answers1

0

I got it using Prefetch:

obj = get_object_or_404(
        Convocacao.objects.prefetch_related(
            Prefetch(
                "cursos",
                queryset=Curso.objects.annotate(
                    total_ingressantes=Sum(
                        Case(
                            When(
                                Q(
                                    convocacao__registroconvocacao__tipo_convocacao=RegistroConvocacao.TIPO_CONVOCACAO_INGRESSANTE
                                )
                                & Q(convocacao__registroconvocacao__aluno__curso=F("id")),
                                then=1,
                            ),
                            default=0,
                        )
                    ),
                    total_concluintes=Sum(
                        Case(
                            When(
                                Q(
                                    convocacao__registroconvocacao__tipo_convocacao=RegistroConvocacao.TIPO_CONVOCACAO_CONCLUINTE
                                )
                                & Q(convocacao__registroconvocacao__aluno__curso=F("id")),
                                then=1,
                            ),
                            default=0,
                        )
                    ),
                ).order_by("diretoria__setor__uo"),
            )
        ),
        pk=pk,
    )
Neto
  • 11
  • 1