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

489
Visualizações
¿Cómo formatear mejor la consulta de filtro Django para +1000 entradas usando la base de datos SQLite3? (El árbol de expresión es demasiado grande (profundidad máxima 1000))

Los modelos de Django que tengo son Componente y Producto. Los componentes tienen productos como su clave externa. Estoy recuperando un parámetro de búsqueda de request.GET, llamado "componentes", que tiene una lista de subcadenas que pueden pertenecer a cualquier Componente. Según los componentes coincidentes, quiero recuperar todos los productos que tienen este componente y devolvérselo al cliente. Hay aproximadamente 12000 componentes y 3000 productos en mi base de datos SQLite

He estado filtrando Productos con el "|" operador para cada uno de los números de identificación del producto del componente, lo que funciona bien cuando se buscan subcadenas de componentes específicas, como "Lactosa" y "Bacterium".

Sin embargo, cuando busco subcadenas más cortas, como "ac", aparece el error: "OperationalError at /search, Expression tree is too large (profundidad máxima 1000)".

Por lo que puedo entender, es porque la base de datos está ejecutando una multitud de consultas de unión, y más de 1000 de esas consultas provocan ese error.

Me gustaría saber cómo solucionar o solucionar este error. ¿Hay una mejor manera de usar las consultas de filtro de Django?

Aquí está mi models.py:

 from django.db import models class Product(models.Model): id_number = models.IntegerField(primary_key=True) product_name = models.CharField(max_length=200) class Component(models.Model): product = models.ForeignKey(Product, on_delete=models.CASCADE) name = models.CharField(max_length=200)

Aquí está mi extracto de views.py:

 query = Product.objects.all() if 'components' in request.GET and len(request.GET['components']) > 0: component_queries = request.GET['components'].strip().split(",") # List of all components as strings components = Component.objects.all() # Roughly 12000 entries in total, roughly 1700 entries for a worst case after filtering for component_query in component_queries: components &= (Component.objects.filter(name__icontains=component_query) if len(components) == 0: query = Product.objects.none() specified_products = Product.objects.none() for component in components: specified_products |= Product.objects.filter(id_number__icontains=component.product.id_number) query &= specified_products

Para verificar que el error estaba en el extracto, limité la cantidad de componentes en el ciclo for a menos de 1000 y el motor de búsqueda funcionó bien.

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

0

Puedes filtrar con:

 from django.db.models import Q component_queries = request.GET['components'].strip().split(',') Product.objects.filter( Q(*[ Q( component__name __icontains=component_query) for component_query in component_queries ]) )

Sin embargo, lo anterior solo recuperará Product que tengan un componente que coincida con todos los component_query .

Si desea encontrar productos que tengan al menos un componente para el que coincida la cadena, trabaje con:

 from django.db.models import Q component_queries = request.GET['components'].strip().split(',') Product.objects.filter( Q(*[ Q(component__name__icontains=component_query) for component_query in component_queries ], _connector=Q.OR ) ) .distinct()

El .distinct() [Django-doc] evitará recuperar el Product tantas veces como haya componentes coincidentes.

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