TypeError:抽象基类包含代理模型'TokenProxy'不允许的模型字段尝试在Django中进行迁移时

问题描述

我创建了一个自定义用户模型,用电子邮件替换用户名,并希望将其与Djoser和React一起使用。
但是,当我尝试进行迁移时,出现此错误(下面有更多详细信息):

TypeError: Abstract base class containing model fields not permitted for proxy model 'TokenProxy'.

models.py:

from django.db import models
from django.contrib.auth.models import AbstractBaseUser,BaseUserManager,PermissionsMixin

class UserAccountManager(BaseUserManager):
    def create_user(self,email,name,password=None):
        if not email:
            raise ValueError('Users must have an email address')
        
        email = self.normalize_email(email)
        user = self.model(email=email,name=name)

        user.set_password(password)
        user.save()

        return user

    def create_superuser(self,password,**extra_fields):
        """Create and save a SuperUser with the given email and password."""
        extra_fields.setdefault('is_staff',True)
        extra_fields.setdefault('is_superuser',True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

serializers.py

from djoser.serializers import UserCreateSerializer,UserSerializer
from django.contrib.auth import get_user_model
User = get_user_model()

class UserCreateSerializer(UserCreateSerializer):
    class Meta(UserCreateSerializer.Meta):
        model = User
        fields = ('id','email','name','password')

urls.py

urlpatterns = [
    path('auth/',include('djoser.urls')),path('auth/',include('djoser.urls.jwt')),]

urlpatterns +=  [re_path(r'^.*',TemplateView.as_view(template_name='index.html'))]

当我尝试进行迁移时出现此错误

  File "<frozen importlib._bootstrap>",line 1006,in _gcd_import
  File "<frozen importlib._bootstrap>",line 983,in _find_and_load
  File "<frozen importlib._bootstrap>",line 967,in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>",line 677,in _load_unlocked
  File "<frozen importlib._bootstrap_external>",line 728,in exec_module
  File "<frozen importlib._bootstrap>",line 219,in _call_with_frames_removed
  File "C:\Users\Jonas\djangoprojects\AntDesign\coursesApi\urls.py",line 10,in <module>
    path('api/',include('api.urls')),File "C:\Users\Jonas\.virtualenvs\AntDesign-TgIU7Y6b\lib\site-packages\django\urls\conf.py",line 34,in include
    URLconf_module = import_module(URLconf_module)
  File "c:\users\jonas\appdata\local\programs\python\python37\lib\importlib\__init__.py",line 127,in import_module
    return _bootstrap._gcd_import(name[level:],package,level)
  File "<frozen importlib._bootstrap>",in _call_with_frames_removed
  File "C:\Users\Jonas\djangoprojects\AntDesign\api\urls.py",line 3,in <module>
    from .views import CoursesListView,CoursesDetailView,VideoListView,VideoDetailView
  File "C:\Users\Jonas\djangoprojects\AntDesign\api\views.py",line 4,in <module>
    from .serializers import CourseSerializer,VideoSerializer
  File "C:\Users\Jonas\djangoprojects\AntDesign\api\serializers.py",line 1,in <module>
    from djoser.serializers import UserCreateSerializer,UserSerializer
  File "C:\Users\Jonas\.virtualenvs\AntDesign-TgIU7Y6b\lib\site-packages\djoser\serializers.py",line 15,in <module>
    class UserSerializer(serializers.ModelSerializer):
  File "C:\Users\Jonas\.virtualenvs\AntDesign-TgIU7Y6b\lib\site-packages\djoser\serializers.py",line 16,in UserSerializer
    class Meta:
  File "C:\Users\Jonas\.virtualenvs\AntDesign-TgIU7Y6b\lib\site-packages\djoser\serializers.py",line 19,in Meta
    settings.USER_ID_FIELD,File "C:\Users\Jonas\.virtualenvs\AntDesign-TgIU7Y6b\lib\site-packages\django\utils\functional.py",line 256,in inner
    self._setup()
  File "C:\Users\Jonas\.virtualenvs\AntDesign-TgIU7Y6b\lib\site-packages\djoser\conf.py",line 140,in _setup
    self._wrapped = Settings(default_settings,explicit_overriden_settings)
  File "C:\Users\Jonas\.virtualenvs\AntDesign-TgIU7Y6b\lib\site-packages\djoser\conf.py",line 116,in __init__
    self._init_settings_to_import()
  File "C:\Users\Jonas\.virtualenvs\AntDesign-TgIU7Y6b\lib\site-packages\djoser\conf.py",line 135,in _init_settings_to_import
    setattr(self,setting_name,import_string(value))
  File "C:\Users\Jonas\.virtualenvs\AntDesign-TgIU7Y6b\lib\site-packages\django\utils\module_loading.py",line 17,in import_string
    module = import_module(module_path)
  File "c:\users\jonas\appdata\local\programs\python\python37\lib\importlib\__init__.py",level)
  File "C:\Users\Jonas\.virtualenvs\AntDesign-TgIU7Y6b\lib\site-packages\rest_framework\authtoken\models.py",line 43,in <module>
    class TokenProxy(Token):
  File "C:\Users\Jonas\.virtualenvs\AntDesign-TgIU7Y6b\lib\site-packages\django\db\models\base.py",line 174,in __new__
    "permitted for proxy model '%s'." % name
TypeError: Abstract base class containing model fields not permitted for proxy model 'TokenProxy'.

解决方法

请检查django-rest-framework中的following PR

作为解决方法,您可以在rest_framework.authtoken之前将djoser添加到INSTALLED_APPS中。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...