如果您有将存在于其他地方的表/模型,您需要告诉 Django 它们不是托管模型。
在你的models.py 中有这样的东西:
class SomeClass(models.Model):
id = models.IntegerField(db_column="id", primary_key=True)
...other attributes...
class Meta(object):
db_table = "your_table_for_this_model"
managed = getattr(settings, "UNDER_TEST", False)
我使用一个名为“UNDER_TEST”的全局变量,以便在运行我们的测试时,django 将管理模型并创建测试表。如果您的数据库允许创建测试表,您可能不必这样做。我们的数据库受到严格管理,并且禁止创建测试表,因此我们使用这种解决方法来确保我们可以创建/运行测试以保持我们的代码被覆盖/测试。
在您的情况下,它只是一个 User 模型(我们也将它放在一个带有它自己的表的单独数据库中)我们有这样的:
class User(AbstractUser):
...our attributes...
class Meta:
db_table = "ourApp_user"
这就是我们User 模型的专业内容。
我们的设置和你一样,但是我们不使用DATABASE_ROUTERS
AUTH_USER_MODEL = 'users.User'
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
)
"default": {
"ENGINE": "sql_server.pyodbc",
"NAME": os.environ.get("default_NAME"),
"HOST": os.environ.get("default_HOST"),
"USER": os.environ.get("default_USER"),
"PASSWORD": os.environ.get("default_PASSWORD"),
"PORT": os.environ.get("default_PORT"),
"OPTIONS": {
"host_is_server": True,
"driver": "ODBC Driver 13 for SQL Server",
},
"TEST": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": os.path.join(BASE_DIR, "default-db.sqlite3"),
},
},
"other_db": {
"ENGINE": "sql_server.pyodbc",
"NAME": os.environ.get("other_db_NAME"),
"HOST": os.environ.get("other_db_HOST"),
"USER": os.environ.get("other_db_USER"),
"PASSWORD": os.environ.get("other_db_PASSWORD"),
"PORT": os.environ.get("other_db_PORT"),
"OPTIONS": {
"host_is_server": True,
"driver": "ODBC Driver 13 for SQL Server",
},
"TEST": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": os.path.join(BASE_DIR, "other-db.sqlite3"),
},
},
尝试删除 app_label 并放入 db_table,或离开 app_label 并放入 db_table 以明确告诉它应该查看哪个表。
如果它是一个表格,你将通过其他方式填充,并且如果你不希望 Django 管理其中的数据(例如:如果你有一个脚本生活在其他地方填充一个特定的表格您的应用需要引用)。