Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

490
Vistas
¿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 Respuestas
Responde la pregunta

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda