Django是新的,但在我们的用例中,我们需要基于令牌的身份验证,但需要将令牌链接到默认的“用户”模型(django.contrib.auth.models.User)以外的模型。为此,我们可以重写令牌模型/类,也可以继承Token模型并添加新字段并将user字段设置为None,但Django Docs表示
在Django中,模型字段通常不允许这样做。如果非抽象模型基类有一个名为author的字段,则不能在继承自该基类的任何类中创建另一个模型字段或定义一个名为author的属性。
但不久之后,它说,
此限制不适用于从抽象模型继承的模型字段。这些字段可以用另一个字段或值重写,也可以通过设置field_name = None来删除。
现在,如果我们不将rest_framework.authtoken添加到settings.py中,则Token类在技术上是抽象的。因为在Token的源代码中,
abstract = 'rest_framework.authtoken' not in settings.INSTALLED_APPS那么,是否允许以这种方式覆盖令牌类,还是完全重写模型更好呢?
发布于 2022-11-04 23:57:52
不确定这个问题是否仍然与您相关,但是对于仍感兴趣的人,您应该在应用程序中的rest_framework.authentication.TokenAuthentication文件中创建一个authentication.py类的子类(在我的例子中是user)包,例如:
from rest_framework.authentication import TokenAuthentication as BaseTokenAuthentication
from user.models import Token
class TokenAuthentication(BaseTokenAuthentication):
model = Token在这里,您将来自models.py的以下自定义models.py类设置为模型:
from rest_framework.authtoken.models import Token as BaseToken
class Token(BaseToken):
key = models.CharField(_('Key'), max_length=40, unique=True)
user = models.ForeignKey(
settings.AUTH_USER_MODEL, related_name='auth_token',
on_delete=models.CASCADE, verbose_name=_('User')
)在您的项目的settings.py设置(user是我的应用程序名称):
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'user.authentication.TokenAuthentication',
]
}希望这能有所帮助。
https://stackoverflow.com/questions/48021343
复制相似问题