私は複数のデータベースを持っています.1つはDjangoが管理し、もう1つは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 のリストが長すぎるため、データベースでこれ以上削減を実行できません。受け取ったエラーは次のとおりです。
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を使用しようとしましたが、これはうまくいかないようです. 非常に大きなセットを減らす方法についてのアイデアはありますか?
ヒントをありがとう!