【问题标题】:Django custom filter in admin using multiple databases使用多个数据库在管理员中的 Django 自定义过滤器
【发布时间】:2013-02-27 11:25:27
【问题描述】:

我有多个数据库,一个是 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_pa​​cket,但这次我认为再次增加该值不是正确的方法。更改

我的 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,但这似乎不起作用。 你知道如何减少非常大的集合吗?

感谢任何提示!

【问题讨论】:

  • Django 支持多数据库路由。 Refer here.
  • 这是我已经拥有的。本文描述了如何添加第二个或外部数据库,但没有在内部(Django 托管数据库)的数据和包含相同键的外部数据库之间设置外键关系。

标签: django django-queryset django-filters


【解决方案1】:

玩游戏有点太晚了,但我几周前才开始使用 Django,而且我有很大的桌子可以使用。对于大型查询,我在 Django 中使用 RAW Sql 和游标实际上是为了限制返回的输出,并分批处理它。查询集获取所有内容并将其加载到内存中,这在大型部署中并不实用。

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

【讨论】:

    猜你喜欢
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 2013-01-15
    • 2021-01-01
    • 1970-01-01
    相关资源
    最近更新 更多