4

それはバグですか、それとも間違っていますか? 私はスーパーユーザーを作成する段階にありますが、ルーターが機能しているように見えても、djangoは間違ったデータベースにテーブルを望んでいます:

設定.py

DATABASES = {
      'intern_db': {
        'ENGINE': 'mysql.connector.django',
        'NAME': 'django_cartons',
            'USER': 'root',
            'PASSWORD' : '',
      },
    'default': {
        'ENGINE': 'mysql.connector.django',
        'NAME': 'cartons',
            'USER': 'root',
            'PASSWORD' : '',
    }
}

DATABASE_ROUTERS = ['web.routers.AuthRouter']

routers.py

class AuthRouter(object):
      """
      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.
            """
            print("READ ",model._meta.app_label)
            if model._meta.app_label in ['auth', 'contenttypes', 'admin', 'sessions']:
               print(True)
               return 'intern_db'
            return None

      def db_for_write(self, model, **hints):
            """
            Attempts to write auth models go to auth.
            """
            print("WRITE ",model._meta.app_label)
            if model._meta.app_label in ['auth', 'contenttypes', 'admin', 'sessions']:
               print(True)
               return 'intern_db'
            return None

      def allow_relation(self, obj1, obj2, **hints):
            """
            Allow relations if a model in the auth app is involved.
            """
            print("REL ", obj1._meta.app_label, ' ', obj2._meta.app_label)
            if obj1._meta.app_label in ['auth', 'contenttypes', 'admin', 'sessions'] or \
               obj2._meta.app_label in ['auth', 'contenttypes', 'admin', 'sessions']:
               return True
            return None

      def allow_migrate(self, db, model):
            """
            Make sure the auth app only appears in the 'auth'
            database.
            """
            if db == 'intern_db':
               return (model._meta.app_label in ['auth', 'contenttypes', 'admin', 'sessions'])
            elif model._meta.app_label in ['auth', 'contenttypes', 'admin', 'sessions']:
               return False
            return None

指図 :

$> ./manage.py createsuperuser
READ  auth
True
READ  auth
True
Username (leave blank to use 'leo'): admin
Traceback (most recent call last):
  File "/usr/lib/python3.4/site-packages/mysql/connector/django/base.py", line 115, in _execute_wrapper
    return method(query, args)
  File "/usr/lib/python3.4/site-packages/mysql/connector/cursor.py", line 507, in execute
    self._handle_result(self._connection.cmd_query(stmt))
  File "/usr/lib/python3.4/site-packages/mysql/connector/connection.py", line 722, in cmd_query
    result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
  File "/usr/lib/python3.4/site-packages/mysql/connector/connection.py", line 640, in _handle_result
    raise errors.get_exception(packet)
mysql.connector.errors.ProgrammingError: 1146 (42S02): Table 'cartons.auth_user' doesn't exist

ご覧のとおり、存在しない 'cartons.auth_user' を探します (代わりに 'intern_db' によってエイリアス化された 'django_cartons' である必要があります)。コマンド出力の「TRUE」...

何か案が ?

4

2 に答える 2

3

問題は、システムが多少壊れていることです。一部のタスクの構成は尊重しますが、他のタスクの構成は尊重しません (出力の最初の 2 つの「TRUE」)。

これは、奇妙であっても意図されている可能性があります (実際には、複数の管理データベースを持つことを禁止するものは何もなく、自動的なダーク チョイスを許可しません)。

実際に別のデータベースに SU を作成するには、これらのコマンドを使用するために、明示的に作成するデータベースを渡す必要があります。

./manage.py createsuperuser --database=intern_db

: データベース名は構成内のエイリアスです。

于 2015-02-18T23:17:44.427 に答える
0

スーパーユーザーを作成する前に、データベースへの移行を行う必要があります。移行を行うには

user@root:~$python manage.py migrate

これによりauth_user、データベースにテーブルが作成されます。

于 2020-06-13T15:12:19.523 に答える