동작은, 일부 글로벌 값을 수정할 필요로 이름을 바꿉니다로 objects_db_one 또는 objects_db_two을 사용하려면
는 또는 IMO, 따라서
with statement
은 아니다
class DB_one_ItemsManager(models.Manager):
def get_query_set(self):
return super(DB_one_ItemsManager, self).get_query_set().using("database1")
class DB_two_ItemsManager(models.Manager):
def get_query_set(self):
return super(DB_two_ItemsManager, self).get_query_set().using("database2")
class YourModel(models.Model):
#Some fields here
#...
objects_db_one=DB_one_ItemsManager()
objects_db_two=DB_two_ItemsManager()
적절한 방법.
qs = User.objects.db_manager('slice_2')
foo = qs.filter(...)
bar = qs.filter(...)
:
from contextlib import contextmanager
@contextmanager
def unsafe_modify_queryset_db(model_dbs):
"""model_dbs => sequence of tuple (model, db for the model to use).
For example ((User, 'slice_2'), ...)
"""
prev_db = map(lambda x:x[0].objects._db , model_dbs)
for model, db in model_dbs:
model.objects._db = db
yield
# restore previous db
for x, db in zip(model_dbs, prev_db):
x[0].objects._db = prev_db
# then
with unsafe_modify_queryset_db((User, 'slice_2', ...)):
User.objects.filter(...)
또한 luke14free의 코드와 같은 목표를 달성 검색어 세트 수준에서 작동하도록 db_manager을 사용할 수 물론,은, 암시 더러운 및 스레드 안전하지 않은 방법으로 수행 할 수 있습니다
Explicit가 암시 적보다 낫다는 것을 기억하십시오. 코드를 정렬하고 동일한 db를 함수 호출에 포함하는 쿼리 세트를 포함하는 것이 더 좋을 것입니다.
출처
2012-04-12 09:50:49
okm
예. 나는 그것에 대해 생각했지만 모든 모델을 사용하여 모든 관리자를 정의해야합니다. – code22
@ code22 관리자는 모델 추상이므로 각 데이터베이스에 하나만 존재합니다. 그러면 관리자를 삽입 할 수 있습니다 당신이 원하는 각 모델에서. – luke14free
하지만 사용자 또는 내가 정의하지 않은 다른 모델의 관리자를 추가 할 수 없습니다. 모델을 수정할 필요가없는 솔루션을 찾고있었습니다. – code22