【问题标题】:Custom (swappable) models for Django OAuth ToolkitDjango OAuth Toolkit 的自定义(可交换)模型
【发布时间】: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.E304fields.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


    【解决方案1】:

    我和我的朋友做了以下事情: 覆盖 Django OAuth 工具包使用的类是 没有迁移和迁移之类的设置:

    OAUTH2_PROVIDER_APPLICATION_MODEL = 'oauth2_provider.Application'
    OAUTH2_PROVIDER_REFRESH_TOKEN_MODEL = 'oauth2_provider.RefreshToken'
    

    运行迁移后删除或注释上述变量并放入变量 指需要被覆盖的类,在我们的例子中是这样的:

    OAUTH2_PROVIDER_APPLICATION_MODEL = 'authentication.OAuthApplication'
    OAUTH2_PROVIDER_GRANT_MODEL = 'authentication.OAuthGrant'
    OAUTH2_PROVIDER_ACCESS_TOKEN_MODEL = 'authentication.OAuthAccessToken'
    OAUTH2_PROVIDER_REFRESH_TOKEN_MODEL = 'authentication.OAuthRefreshToken'
    

    在此链接中,https://django-oauth-toolkit.readthedocs.io/en/latest/advanced_topics.html#extending-the-application-model 包含有关您为什么需要执行此过程的详细信息。

    【讨论】:

      猜你喜欢
      • 2019-06-19
      • 2021-11-19
      • 2021-05-08
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 2012-11-14
      • 2016-01-09
      相关资源
      最近更新 更多