我有多个数据库,一个Django管理,一个外部包含相关信息,用于使用SimpleListFilter在Django管理员内部进行过滤。 由于Django的限制我没有跨数据库的外键,我在外部数据库中进行查找以获取例如目标版本号。根据该查找列表,我可以减少查询集。
现在问题是我的数据库太大而无法以这种方式过滤,因为生成的SQL查询如下所示:
SELECT 'status'.'id', 'status'.'service_number', 'status'.'status'
FROM 'status'
WHERE ('status'.'service_number' = '01xxx' OR 'status'.'service_number' = '02xxx' OR 'status'.'service_number' = '03xxx' ......
OR列表太长,无法再在数据库中完成reduce,收到的错误是:
Django Version: 1.4.4
Exception Type: DatabaseError
Exception Value: (1153, "Got a packet bigger than 'max_allowed_packet' bytes")
我在MySQL中已经增加了max_allowed_packet,但这次我认为这不是简单地再次增加该值的正确方法。更改
我的SimpleListFilter看起来像:
class TargetFilter(SimpleListFilter):
parameter_name = 'target'
def lookups(self, request, model_admin):
return (
('v1', 'V1.0'),
('v2', 'V2.0'),
)
def queryset(self, request, queryset):
if self.value():
lookup = []
for i in Target.objects.using('externaldb').filter(target=self.value()).values('service_number').distinct():
lookup.append(str(i['service_number']))
qlist = [Q(**{'service_number': f}) for f in lookup]
queryset = queryset.filter(reduce(operator.or_, qlist))
return queryset
列出的代码工作了多年,但速度变慢了,现在根本不工作。我试过使用frozensets,但这似乎不起作用。 你对如何减少非常大的集合有所了解吗?
感谢任何提示!
答案 0 :(得分:0)
游戏开始得太晚了,但几周前我才开始与Django合作,并且我有很多工作要做。对于大型查询,事实上,我在Django和游标中使用了RAW Sql来限制返回的输出,并分批处理它。查询集可以获取所有内容并将其加载到内存中,这在大型部署中不可行。
查看https://docs.djangoproject.com/en/3.0/topics/db/sql/,更具体地说,直接执行自定义SQL