2011-03-08 82 views
1

我有一個我已經使用了一段時間的django項目,但現在我想從第二個非django數據庫添加一些新的數據集。我已成功配置我的settings.py文件以使用新的數據庫,它被稱爲'mediawikidb'。添加第二個遺留數據庫到現有的django 1.2項目

我能夠運行以下命令:

python manage.py inspectdb --database=mediawikidb 

,我得到Django的模型表示的數據庫,但我感興趣的是所謂的「用戶」表。 inspectdb的輸出是這樣的:

class User(models.Model): 
user_id = models.IntegerField(primary_key=True) 
user_name = models.CharField(unique=True, max_length=255) 
user_real_name = models.CharField(max_length=255) 
user_password = models.TextField() 
user_newpassword = models.TextField() 
user_newpass_time = models.CharField(max_length=14, blank=True) 
user_email = models.TextField() 
user_options = models.TextField() 
user_touched = models.CharField(max_length=14) 
user_token = models.CharField(max_length=32) 
user_email_authenticated = models.CharField(max_length=14, blank=True) 
user_email_token = models.CharField(max_length=32, blank=True) 
user_email_token_expires = models.CharField(max_length=14, blank=True) 
user_registration = models.CharField(max_length=14, blank=True) 
user_editcount = models.IntegerField(null=True, blank=True) 
class Meta: 
    db_table = u'user' 

我一直在閱讀的文檔[0]但我很困惑,所以我想讀了一段時間後,我會問這裏。我不能把這個放在我的模型中,對嗎?如果我這樣做肯定會導致django的問題。我應該怎麼做?

我的另一個問題是,django如何知道'User'模型實例與哪個數據庫有關?我覺得我錯過了一些東西,但我找不到任何有意義的東西。

我應該如何設置我的模型才能訪問這些數據,而不會在django中搞亂任何東西?

[0] http://docs.djangoproject.com/en/dev/topics/db/multi-db/

回答

1

檢查以下文檔:

http://docs.djangoproject.com/en/dev/topics/db/multi-db/#an-example

它們具有指示在何處讀取數據和將數據寫入到一個路由器的一個例子。對於您的用戶模型,您可以配置與mediawiki數據庫的所有交互,並且所有其他模型將使用您的普通數據庫。

只要確保禁用關係......

class MyAppRouter(object): 

    def _is_user_model(model): 
     return str(model.__name__) == 'User' and model._meta.app_label == 'myapp' 

    def db_for_read(self, model, **hints): 
     if self._is_user_model(model): 
      return 'mediawikidb' 
     return None 

    def db_for_write(self, model, **hints): 
     if self._is_user_model(model): 
      return 'mediawikidb' 
     return None 

    def allow_relation(self, obj1, obj2, **hints): 
     if self._is_user_model(obj1) or self._is_user_model(obj2): 
      return False 
     return None 

    def allow_syncdb(self, db, model): 
     if db == 'mediawikidb': 
      return False 
     elif self._is_user_model(model): 
      return False 
     return None 
+0

它會成爲'db_for_read'嗎?我想我不瞭解路由器的工作原理。 – ajt 2011-03-08 00:37:19

+0

檢查新的解決方案(未經測試) – Dimitry 2011-03-08 00:41:01

+0

我應該說我的示例假設您的用戶模型駐留在名爲「myapp」的應用中 – Dimitry 2011-03-08 00:44:39

2

我相信你是擔心被稱爲user表,模型類被稱爲User。 Django在表中使用app_modelname,因此django.contrib.auth的表格是auth_user

Django不知道您的用戶模型與哪個數據庫相關。它將採用默認值,所以它會查找表user,這可能不存在於您的數據庫中。

要查詢它,您需要指定特定數據庫(User.objects.using('mydb').all())或按Dimitry建議設置自動數據庫路由。

相關問題