django - Django OAuth 工具包的自定义(可交换)模型

标签 django django-models django-migrations

我需要创建自定义 Django OAuth 工具包模型。 我有一个包含这些模型的应用程序:

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'.

最佳答案

我和我的 friend 做了以下事情: 覆盖 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包含有关您为何需要执行此过程的详细信息。

关于django - Django OAuth 工具包的自定义(可交换)模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51103615/

相关文章:

django - 日期输入 : how to show placeholder

django - 为什么与 self 的多对多关系不能对称

mysql - 无法使用 Django 3.0.3 中的迁移 API 使用 ModelState 和 ProjectState 进行迁移

python - Django View 代码有奇怪的行为

python - 如何在 azure 广告中实现单点登录 django 身份验证?

django - 如何在 Django 中指定模板加载的顺序?

使用代理模型时 Django StdImage 将不起作用

Django: django.db.utils.IntegrityError: (1215, 'Cannot add foreign key constraint' )

django - Django迁移中如何创建GIN索引

python - 无法使用react js将文件上传到django rest框架