Можем ли мы определить имя базы данных в models.py в Django? - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть несколько баз данных, определенных в settings.py.In models.py Я должен использовать таблицу auth_user из определенной базы данных, а не из базы данных по умолчанию. Как мы можем определить это в models.py?У меня есть базы данных, определенные в settings.py как показано ниже:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'sources',
        'USER': 'root',
        'PASSWORD': 'cdffd@123',
        'HOST': 'xx.xx.xx.xxx',
        'PORT': '3306',
    },
    'abc': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'customers',
        'USER': 'root',
        'PASSWORD': 'dsgfsd@123',
        'HOST': 'xx.xx.xx.xxx',
        'PORT': '3306',
    },
    'xyz': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'users',
        'USER': 'root',
        'PASSWORD': 'ewet@123',
        'HOST': 'xx.xx.xx.xxx',
        'PORT': '3306',
    },
}

в моем models.py Я определил модель пользователя, как показано ниже:

class User(AbstractBaseUser, PermissionsMixin, BaseUserManager):
    name_regex                  = RegexValidator(regex="^[a-zA-Z]+$",message="Enter only Alphabets")#regular expression for name
    email_regex                 = RegexValidator(regex="^\w.+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$",message="Enter valid Email Id")#regular expression for email
    password                    = models.CharField(_("Password"),max_length=128,default='')  
    last_login                  = models.DateTimeField(_('date Last Login'), null=True, blank=True)
    is_superuser                = models.BooleanField(_("Super User"),default=0)
    username                    = models.CharField(_('Username'), max_length=75,blank=True,null=True)
    first_name                  = models.CharField(_('First name'),default='',blank=True,null=True, max_length=20)
    last_name                   = models.CharField(_('Last name'),default='',blank=True,null=True,  max_length=20)
    email                       = models.EmailField(_('Enter your email address'),unique=True,max_length=254,error_messages={'unique':"Email ID already registered.",'invalid':'Enter valid Email ID'})
    is_staff                    = models.BooleanField(_('staff status'), default=False)
    is_active                   = models.BooleanField(_('active'), default=True)#A boolean attribute that indicates whether the user is considered “active”
    date_joined                 = models.DateTimeField(_('Date joined'))
    iRoleID                     = models.IntegerField(_("Role"),default=0) 
    iModifiedBy                 = models.IntegerField(_("Modified By"),blank=True,null=True)
    dtModifiedOn                = models.DateTimeField(_("Modified On"),blank=True,null=True)
    apitoken_validity           = models.IntegerField(default=0)
    authentication_type         = models.IntegerField(default=1)
    iMSISDN                     = models.IntegerField(_('Mobile Number'),default=0)
    objects = UserManager()
    USERNAME_FIELD = 'email'# unique identifier. The field must be unique
    REQUIRED_FIELDS = ['username']
    def __unicode__(self):
        return self.username    
    def __str__(self):
        return self.email
    class Meta:
        app_label = 'users'
        db_table = "auth_user"

По умолчанию используется таблица auth_userиз базы данных, определенной по умолчанию. Но мне нужно взять таблицу auth_user из базы данных, определенной в xyz.Это возможно?если возможно, как я могу это сделать?

1 Ответ

0 голосов
/ 26 декабря 2018

Вы можете сделать это, используя маршрутизаторы базы данных.

пример будет:

class AuthRouter:
    """
    A router to control all database operations on models in the
    auth application.
    """
    def db_for_read(self, model, **hints):
        """
        Attempts to read auth models go to auth_db.
        """
        if model._meta.db_table == 'auth_users':
            return 'auth_db'
        return None

    def db_for_write(self, model, **hints):
        """
        Attempts to write auth models go to auth_db.
        """
        if model._meta.db_table == 'auth_users':
            return 'auth_db'
        return None

и затем добавьте его в settings.py, используя

DATABASE_ROUTERS = ['path.to.AuthRouter']

ref: Документация Django

...