我擁有的 Django 模型是組件和產品。組件將 Products 作為外鍵。我正在從 request.GET 檢索一個名為“components”的搜索引數,它有一個可以屬于任何組件的子字串串列。根據匹配的組件,我想檢索具有此組件的所有產品并將其回傳給客戶端。我的 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,并且搜索引擎運行良好。
uj5u.com熱心網友回復:
您可以過濾:
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
])
)
然而,以上只會檢索Product具有匹配所有 component_querys的輔音的s。
如果您想查找至少有一個與字串匹配的組件的產品,您可以使用:
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()
的.distinct()[Django的DOC]將防止檢索Product,很多時候,因為有匹配元件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/367209.html
下一篇:列印'1'的最大子序列的長度
