2016-10-19 9 views
0

Djangoアプリケーションでmasterデータベースと読み取りレプリカを使用してマルチデータベースを使用していますが、レプリケーションの遅延問題を避けるため、 DBを手動で設定する場所はほとんどありません。Django:prefetch_relatedに使用されるデータベースが親クエリと同じではありません

私はprefetch_relatedに使用するデータベースを指定する方法がわからないため、問題に直面しています。

たとえば、次のクエリでread_replica DBのみを使用しますが、2つのクエリを実行すると、最初はread_replicaになり、2番目のクエリはdefault DBになります。

users = UserProfile.objects.using('read_replica').prefetch_related('usermedia_set').filter(id__in=user_ids) 

これは、このクエリの出力です:

SELECT @@ SQL_AUTO_IS_NULLは、 args = None

SELECT VERSION();引数= ftmanager_userprofileftmanager_userprofileid IN(33)FROMなし

SELECT ...;。argsが=(33、)

はSQL_AUTO_IS_NULLをSELECT @@;引数=なし

SELECT VERSION(); 。引数= ftmanager_usermedia WHERE ftmanager_usermedia FROMなし

SELECT ... user_id IN(33);引数の=(33、)

I S関連するチケットはDjango ticketsですが、using()を内部クエリーセットに適用する方法はわかりません。

答えて

0

私は解決策は、Djangoのチケットについて考えて発見した、あなたはprefetch_relatedによって使用される内部クエリセットを定義するためにPrefetchクラスを使用する必要があり、それは本当にコードを台無ししかし、利得はそれに値する:

from django.db.models.query import Prefetch 
users = UserProfile.objects.using('read_replica').prefetch_related(Prefetch('usermedia_set', queryset=UserMedia.objects.using('read_replica'))).filter(id__in=user_ids) 
関連する問題