Django在admin中使用多个数据库自定义过滤器



我有多个数据库,一个Django管理和一个外部包含相关信息的Django admin使用SimpleListFilter过滤下来。由于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

列出的代码工作了多年,但变得越来越快,现在根本无法工作。我试过用冷冻套餐,但似乎行不通。你知道我怎样才能缩小这么大的集合吗?

谢谢你的提示!

对游戏来说有点太晚了,但我几周前才开始使用Django,我有很多表要处理。对于大型查询,我使用Django中的RAW Sql和游标来限制返回的输出,并分批处理。查询集获取所有内容并将其加载到内存中,这在大型部署中是不实用的。

查看https://docs.djangoproject.com/en/3.0/topics/db/sql/,更具体地说,直接执行自定义SQL

相关内容

  • 没有找到相关文章

最新更新