【发布时间】:2018-12-08 18:14:04
【问题描述】:
我需要创建自定义 Django OAuth Toolkit 模型。 我有一个包含这些模型的应用程序:
from django.utils.translation import ugettext_lazy as _
from oauth2_provider.models import (
AbstractApplication, AbstractGrant,
AbstractAccessToken, AbstractRefreshToken
)
class Application(AbstractApplication):
GRANT_TYPES = (
(AbstractApplication.GRANT_AUTHORIZATION_CODE, _("Authorization code")),
(AbstractApplication.GRANT_IMPLICIT, _("Implicit")),
)
class Grant(AbstractGrant):
pass
class AccessToken(AbstractAccessToken):
pass
class RefreshToken(AbstractRefreshToken):
pass
和设置:
INSTALLED_APPS = [
...
'oauth2_provider',
...
'apps.oauth.apps.OauthConfig',
...
]
OAUTH2_PROVIDER_GRANT_MODEL = 'oauth.Grant'
OAUTH2_PROVIDER_APPLICATION_MODEL = 'oauth.Application'
OAUTH2_PROVIDER_ACCESS_TOKEN_MODEL = 'oauth.AccessToken'
OAUTH2_PROVIDER_REFRESH_TOKEN_MODEL = 'oauth.RefreshToken'
当我尝试进行迁移时,我收到了这个错误:
ValueError: The field oauth2_provider.AccessToken.application was declared with a lazy reference to 'oauth.application', but app 'oauth' isn't installed.
The field oauth2_provider.AccessToken.source_refresh_token was declared with a lazy reference to 'oauth.refreshtoken', but app 'oauth' isn't installed.
The field oauth2_provider.Grant.application was declared with a lazy reference to 'oauth.application', but app 'oauth' isn't installed.
The field oauth2_provider.RefreshToken.access_token was declared with a lazy reference to 'oauth.accesstoken', but app 'oauth' isn't installed.
The field oauth2_provider.RefreshToken.application was declared with a lazy reference to 'oauth.application', but app 'oauth' isn't installed.
如果我删除 OAUTH2_PROVIDER_***_MODEL 设置并再次运行 makemigrations,我会收到很多 fields.E304 和 fields.E305 错误:
SystemCheckError: System check identified some issues:
ERRORS:
oauth.AccessToken.application: (fields.E304) Reverse accessor for 'AccessToken.application' clashes with reverse accessor for 'AccessToken.application'.
HINT: Add or change a related_name argument to the definition for 'AccessToken.application' or 'AccessToken.application'.
oauth.AccessToken.source_refresh_token: (fields.E304) Reverse accessor for 'AccessToken.source_refresh_token' clashes with reverse accessor for 'AccessToken.source_refresh_token'.
HINT: Add or change a related_name argument to the definition for 'AccessToken.source_refresh_token' or 'AccessToken.source_refresh_token'.
oauth.AccessToken.source_refresh_token: (fields.E305) Reverse query name for 'AccessToken.source_refresh_token' clashes with reverse query name for 'AccessToken.source_refresh_token'.
HINT: Add or change a related_name argument to the definition for 'AccessToken.source_refresh_token' or 'AccessToken.source_refresh_token'.
oauth.Grant.application: (fields.E304) Reverse accessor for 'Grant.application' clashes with reverse accessor for 'Grant.application'.
HINT: Add or change a related_name argument to the definition for 'Grant.application' or 'Grant.application'.
oauth.RefreshToken.access_token: (fields.E304) Reverse accessor for 'RefreshToken.access_token' clashes with reverse accessor for 'RefreshToken.access_token'.
HINT: Add or change a related_name argument to the definition for 'RefreshToken.access_token' or 'RefreshToken.access_token'.
oauth.RefreshToken.access_token: (fields.E305) Reverse query name for 'RefreshToken.access_token' clashes with reverse query name for 'RefreshToken.access_token'.
HINT: Add or change a related_name argument to the definition for 'RefreshToken.access_token' or 'RefreshToken.access_token'.
oauth.RefreshToken.application: (fields.E304) Reverse accessor for 'RefreshToken.application' clashes with reverse accessor for 'RefreshToken.application'.
HINT: Add or change a related_name argument to the definition for 'RefreshToken.application' or 'RefreshToken.application'.
oauth2_provider.AccessToken.application: (fields.E304) Reverse accessor for 'AccessToken.application' clashes with reverse accessor for 'AccessToken.application'.
HINT: Add or change a related_name argument to the definition for 'AccessToken.application' or 'AccessToken.application'.
oauth2_provider.AccessToken.source_refresh_token: (fields.E304) Reverse accessor for 'AccessToken.source_refresh_token' clashes with reverse accessor for 'AccessToken.source_refresh_token'.
HINT: Add or change a related_name argument to the definition for 'AccessToken.source_refresh_token' or 'AccessToken.source_refresh_token'.
oauth2_provider.AccessToken.source_refresh_token: (fields.E305) Reverse query name for 'AccessToken.source_refresh_token' clashes with reverse query name for 'AccessToken.source_refresh_token'.
HINT: Add or change a related_name argument to the definition for 'AccessToken.source_refresh_token' or 'AccessToken.source_refresh_token'.
oauth2_provider.Grant.application: (fields.E304) Reverse accessor for 'Grant.application' clashes with reverse accessor for 'Grant.application'.
HINT: Add or change a related_name argument to the definition for 'Grant.application' or 'Grant.application'.
oauth2_provider.RefreshToken.access_token: (fields.E304) Reverse accessor for 'RefreshToken.access_token' clashes with reverse accessor for 'RefreshToken.access_token'.
HINT: Add or change a related_name argument to the definition for 'RefreshToken.access_token' or 'RefreshToken.access_token'.
oauth2_provider.RefreshToken.access_token: (fields.E305) Reverse query name for 'RefreshToken.access_token' clashes with reverse query name for 'RefreshToken.access_token'.
HINT: Add or change a related_name argument to the definition for 'RefreshToken.access_token' or 'RefreshToken.access_token'.
oauth2_provider.RefreshToken.application: (fields.E304) Reverse accessor for 'RefreshToken.application' clashes with reverse accessor for 'RefreshToken.application'.
HINT: Add or change a related_name argument to the definition for 'RefreshToken.application' or 'RefreshToken.application'.
【问题讨论】:
标签: django django-models django-migrations