我遇到了配置Django Tenant和Django Guardian的问题。我想按模式分隔用户。我应该把Guardian放在哪里?我应该如何配置它?到目前为止,我还尝试将它从TENANT_APP切换到SHARED_APP(我得到一个与其他先决条件有关的不同错误,auth),我得到一个错误(下面)。另外一个很好的选择,而不是监护人也将不胜感激。
SHARED_APPS = (
'tenant_schemas',
'myapp.clients',
'django.contrib.contenttypes',
'django.contrib.staticfiles',
)
TENANT_APPS = (
'django.contrib.contenttypes',
'custom_user',
'myapp.users',
'oauth2_provider',
'corsheaders',
'django.contrib.auth',
'django.contrib.admin',
'guardian',
'django.contrib.staticfiles',
'myapp.accounting',
'myapp.budget',
'myapp.enterprise',
'myapp.payables',
'myapp.receivables',
'rest_framework_nested',
'solo',
'rest_framework_swagger',
)
这是我运行python manage.py migrate_schemas时遇到的错误:
relation "users_user" does not exist
LINE 1: ..."."phone_number", "users_user"."email2" FROM "users_coo...
一旦我添加了监护人'就会发生这种情况。在TENANT_APPS
当我在SHARED_APPS中添加它时,我得到了这个:
psycopg2.ProgrammingError: relation "auth_group" does not exist
但是这可以通过django.contrib.admin修复,问题是我希望权限特定于我的租户应用程序
其他配置:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'oauth2_provider.ext.rest_framework.OAuth2Authentication',
),
'DEFAULT_FILTER_BACKENDS': (
'rest_framework.filters.DjangoFilterBackend',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
)
}
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'guardian.backends.ObjectPermissionBackend',
)
查看日志我发现django监护人创建了一个匿名用户
File "/home/myaccount/workspace/enterprise-api/venv/lib/python3.4/site-packages/django/dispatch/dispatcher.py", line 192, in send
response = receiver(signal=self, sender=sender, **named)
File "/home/myaccount/workspace/enterprise-api/venv/lib/python3.4/site-packages/guardian/management/__init__.py", line 33, in create_anonymous_user
User.objects.get(**lookup)
File "/home/myaccount/workspace/enterprise-api/venv/lib/python3.4/site-packages/django/db/models/manager.py", line 122, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/myaccount/workspace/enterprise-api/venv/lib/python3.4/site-packages/django/db/models/query.py", line 381, in get
num = len(clone)
File "/home/myaccount/workspace/enterprise-api/venv/lib/python3.4/site-packages/django/db/models/query.py", line 240, in __len__
self._fetch_all()
File "/home/myaccount/workspace/enterprise-api/venv/lib/python3.4/site-packages/django/db/models/query.py", line 1074, in _fetch_all
self._result_cache = list(self.iterator())
有没有办法告诉监护人等待租户数据库?
答案 0 :(得分:0)
SHARED_APPS = (
#tenant requirements
'tenant_schemas',
'myapp.clients',
'django.contrib.contenttypes',
'django.contrib.staticfiles',
'django.contrib.auth',
'myapp.users',
'guardian',
'oauth2_provider',
'rest_framework',
)
TENANT_APPS = (
'django.contrib.contenttypes',
'custom_user',
'coopmsapi.users',
'oauth2_provider',
'corsheaders',
'django.contrib.auth',
'django.contrib.admin',
'guardian',
'django.contrib.staticfiles',
'rest_framework',
'myapp',
'myapp.accounting',
'myapp.budget',
'myapp.enterprise',
'myapp.payables',
'myapp.receivables',
'rest_framework_nested',
'solo',
'rest_framework_swagger',
)
多次尝试后,这就是最终工作的结果。我还必须先执行几次迁移应用程序SHARED或TENANT的迁移,否则django-tenant会在创建新模式时自动获取它需要创建某些表。