【发布时间】:2022-01-04 06:25:20
【问题描述】:
我拥有的 Django 模型是组件和产品。组件将产品作为其外键。 我正在从 request.GET 中检索一个名为“组件”的搜索参数,该参数包含一个可以属于任何组件的子字符串列表。根据匹配的组件,我想检索具有此组件的所有产品并将其返回给客户端。我的 SQLite 数据库中大约有 12000 个组件和 3000 个产品
我一直在过滤掉带有“|”的产品每个组件的产品 ID 号的运算符,在搜索特定组件子字符串时可以正常工作,例如“乳糖”和“细菌”。
但是,当我搜索较短的子字符串时,例如“ac”,我收到错误消息:“OperationalError at /search, Expression tree is too large (maximum depth 1000)”。
据我了解,这是因为数据库正在执行大量联合查询,其中超过 1000 个查询会导致该错误。
我想知道如何修复或解决此错误。有没有更好的方法来使用 Django 的过滤查询?
这是我的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)
这是我对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
为了验证错误是否在摘录中,我将 for 循环中的组件数量限制为少于 1000 个,并且搜索引擎运行良好。
【问题讨论】: