Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

463
Visualizações
Acelerando Django Rest Framework Model Serializer N+1 Problema de consulta

Tengo una clase DRF ModelSerializer que serializa un modelo de Order . Este serializador tiene un campo:

num_modelA = serializers.SerializerMethodField() `

 def get_num_modelA(self, o): r = ModelA.objects.filter(modelB__modelC__order=o).count() return r

Donde ModelA tiene un campo ForeignKey modelB , ModelB tiene un campo ForeignKey modelC y ModelC tiene un campo ForeignKey order .

El problema con esto es, obviamente, que para cada pedido que se serializa, realiza una consulta adicional a la base de datos, lo que ralentiza el rendimiento.

Implementé un método estático setup_eager_loading como se describe aquí que solucionó el problema de consulta N+1 para otros campos que tenía.

 @staticmethod def setup_eager_loading(queryset): # select_related for "to-one" relationships queryset = queryset.select_related('modelD','modelE') return queryset

Mi idea era que también podía usar prefetch_related para reducir la cantidad de consultas. Pero no estoy seguro de cómo hacerlo, ya que Order y ModelA están separados por varias claves externas. Déjame saber si cualquier otra información sería útil

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Puedes trabajar con una anotación:

 from django.db.models import Count # … @staticmethod def setup_eager_loading(queryset): # select_related for "to-one" relationships return queryset.select_related('modelD','modelE').annotate( num_modelA=Count('modelC__modelB__modelA') )

en el serializador de su Order , puede usar num_modelA como IntegerField :

 from rest_framework import serializers class OrderSerializer(serializers.ModelSerializer): num_modelA = serializers. IntegerField() class Meta: model = Order fields = [ 'num_modelA' , 'and', 'other', 'fields']
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda