2012-01-04 13 views
13

Django'nun çoklu db belgelerine baktım. Modellerimden birkaçını farklı bir db'ye bölmek istiyorum. Ama gerçekten sadece bu modellerin her zaman belirli bir db'de yaşamasını istiyorum. Özel yönlendirmeye ihtiyacım yok. Ve "A, B ve C modelleri X veritabanında yaşıyoruz, D, E ve F modelleri her zaman Y veritabanında yaşıyor" demek için benzersiz yönlendiriciler yazıyor.django'daki model başına db ayarla

Böyle varsayılanları ayarlamak için daha basit bir yol var mı? Örneğin, bir model meta alan olarak?

+0

olası yinelenen [Django? - Bir model için bir veritabanı nasıl belirleneceğini] (http://stackoverflow.com/questions/3519143/django-how-to-specify- a-database-for-a-model) –

cevap

5

Bunun için Meta alanı yoktur (bir noktada bir tane vardı ancak getirdiği sınırlamalar nedeniyle kaldırıldı). Hangi nesnelerin hangi veritabanına gittiğini kontrol etmek için database router'a ihtiyacınız vardır. Senin durumunda, yönlendiricinin uygulanması oldukça kolay olmalı.

16

Kolayca özel modele bağlıyor görünerek bunu yapabilirsiniz:

class A(models.Model): 
    _DATABASE = "X" 

class B(models.Model): 
    _DATABASE = "Y" 
... 

Sonra yönlendirici eklemeniz gerekir.

class CustomRouter(object): 

    def db_for_read(self, model, **hints): 
     return getattr(model, "_DATABASE", "default") 

    def db_for_write(self, model, **hints): 
     return getattr(model, "_DATABASE", "default") 

    def allow_relation(self, obj1, obj2, **hints): 
     """ 
     Relations between objects are allowed if both objects are 
     in the master/slave pool. 
     """ 
     db_list = ('default') 
     return obj1._state.db in db_list and obj2._state.db in db_list 

    def allow_migrate(self, db, model): 
     """ 
     All non-auth models end up in this pool. 
     """ 
     return True 

Ve son adım settings.py içinde yönlendirici specifing edilir: Sonraki bir _DATABASE alana göre veritabanını seçecek ve _DATABASE özniteliği olmadan modeller default veritabanını kullanacak, ayrıca ilişkiler sadece default veritabanı için izin verilecek

Eğer ilişkisel modeller "_DATABASE", niteliği olmayacak çünkü bu durumda, varsayılan olmayan veritabanında birçok çoğa ilişkileri ile çalışmak için gidiyoruz eğer
DATABASE_ROUTERS = ['path.to.class.CustomRouter'] 

BTW bu çözüm işe yaramaz, daha iyi bir şey kullanmak db_for_read/db_for_write filtre koşulu olarak model._meta.app_label gibi ing

+0

Bu çözüm,/else: 'return getattr (model," _DATABASE "," default "i kaldırmak için sürüm 1.3.2 ve django 1.6 –

+1

ile en az django-debug-toolbar ile çakışır. ') ' –

+0

@JohnWoo, yep, düzenlenmiş cevabınız – user3479125