Я создал проект, в котором есть две идентичные модели для работы на дому (wfh) и на работе (wfo). Я хочу, чтобы данные сотрудника были сохранены в базе данных wfh, а данные wfo - в базе данных wfo. Используемая база данных: mysql.
Однако у меня возникают следующие проблемы:
1) Миграция завершается с ошибкой: в методе allow_migrate () в Router_name.py имя-модели получило несколько значений. Поэтому мне пришлось заменить метод allow_migrate () на allow_syncdb (), который избавился от ошибок и были применены миграции.
2) таблицы не создаются, даже если миграции успешны для всех баз данных. Python оболочка не может добавить новые записи сотрудников в базу данных (ошибка таблицы не существует)
3) Создание суперпользователя после ввода только имени пользователя выдает исключение для неправильно настроенной базы данных
4 ) суперпользователь, созданный ранее (сразу после создания проекта) при попытке входа в систему из панели администратора, выдает неверные учетные данные
Структура проекта
Project Folder
|
+--env
|
+--multi_db
|
+--basic_app
| |
| +--AuthRouter.py
| +--DbRouter.py
| +--models.py
|
+--multi_db
| |
| +--settings.py
|
+--manage.py
settings.py
DATABASES = {
'default': {},
'auth_db': {
'NAME': 'auth_db',
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': '3306',
'USER': '***',
'PASSWORD': '***',
# connect options
'OPTIONS': {'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", },
},
'work_from_home':{
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': '3306',
'NAME': 'wfh',
'USER': '***',
'PASSWORD': '***',
# connect options
'OPTIONS': {'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",},
},
'work_from_office':{
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': '3306',
'NAME': 'wfo',
'USER': '***',
'PASSWORD': '***',
# connect options
'OPTIONS': {'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",},
}
}
DATABASE_ROUTERS = ['basic_app.AuthRouter.AuthRouter','basic_app.DbRouter.DatabaseAppsRouter']
DATABASE_APPS_MAPPING = {'wfh_employees': 'work_from_home', 'wfo_employees': 'work_from_office'}
models.py
from django.db import models
# Create your models here.
class WfhEmployee(models.Model):
employee_id = models.PositiveIntegerField(primary_key=True, auto_created=True)
name = models.CharField(max_length=100)
email = models.EmailField(max_length=100)
post = models.CharField(max_length=100)
department = models.CharField(max_length=100)
def __str__(self):
return self.name
class Meta:
app_label = 'wfh_employees'
class WfoEmployee(models.Model):
employee_id = models.PositiveIntegerField(primary_key=True, auto_created=True)
name = models.CharField(max_length=100)
email = models.EmailField(max_length=100)
post = models.CharField(max_length=100)
department = models.CharField(max_length=100)
def __str__(self):
return self.name
class Meta:
app_label = 'wfo_employees'
AuthRouter.py
class AuthRouter:
"""
A router to control all database operations on models in the
auth and contenttypes applications.
"""
route_app_labels = {'auth', 'contenttypes'}
def db_for_read(self, model, **hints):
"""
Attempts to read auth and contenttypes models go to auth_db.
"""
if model._meta.app_label in self.route_app_labels:
return 'auth_db'
return None
def db_for_write(self, model, **hints):
"""
Attempts to write auth and contenttypes models go to auth_db.
"""
if model._meta.app_label in self.route_app_labels:
return 'auth_db'
return None
def allow_relation(self, obj1, obj2, **hints):
"""
Allow relations if a model in the auth or contenttypes apps is
involved.
"""
if (
obj1._meta.app_label in self.route_app_labels or
obj2._meta.app_label in self.route_app_labels
):
return True
return None
def allow_syncdb(self, db, app_label, model_name=None, **hints):
"""
Make sure the auth and contenttypes apps only appear in the
'auth_db' database.
"""
if app_label in self.route_app_labels:
return db == 'auth_db'
return None
DbRouter.py
class DatabaseAppsRouter:
def db_for_read(self, model, **hints):
"""Point all read operations to the specific database."""
if model._meta.app_label == 'wfo_employees':
return 'work_from_office'
if model._meta.app_label == 'wfh_employees':
return 'work_from_home'
def db_for_write(self, model, **hints):
"""Point all write operations to the specific database."""
if model._meta.app_label == 'wfo_employees':
return 'work_from_office'
if model._meta.app_label == 'wfh_employees':
return 'work_from_home'
def allow_relation(self, obj1, obj2, **hints):
"""Have no opinion on whether the relation should be allowed."""
return None
def allow_syncdb(db, app_label, model_name=None, **hints):
"""Have no opinion on whether migration operation is allowed to run. """
return None
Я использую django версию 3.0.4 и python версию 3.7