Менеджер недоступен auth.User has been swifted

В преддверии вопроса я уже просмотрел несколько похожих вопросов и ответов.

Я пытаюсь расширить класс пользователя, чтобы включить в него другие поля и затем передать эти дополнительные поля в качестве полезной нагрузки на мой access_token.

Я получаю это сообщение об ошибке, когда пытаюсь запустить makemigrations/migrate или выполнить мой код

AttributeError: Manager isn't available; 'auth.User' has been swapped for 'accounts.CustomerUser'

Вот что у меня есть в models.py

from django.db import models
from django.contrib.auth.models import User
from django.contrib.auth.models import AbstractUser

    # #extending user model to include
    class CustomerUser(AbstractUser):
        city = models.CharField(max_length=50,blank=True)
        country = models.CharField(max_length=50, blank=True)
        bio = models.CharField(max_length=500, blank=True)

serializers.py:

from django.contrib.auth import get_user_model
User = get_user_model()

class RegisterSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        #removed url from fields
        fields = ['username', 'email', 'password', 'first_name', 'last_name', 'city', 'country', 'bio']
        extra_kwargs = {
            'password': {'write_only': True},
        }
        def create(self,validated_data):
            user = User.objects.create_user(
                                            username=validated_data['username'],
                                            first_name=validated_data['first_name'],
                                            last_name=validated_data['last_name'],
                                            city=validated_data['city'],
                                            country=validated_data['country'],
                                            bio=validated_data['bio'],
                                            email=validated_data['email'])
            user.set_password(validated_data['password'])
            user.save()
            return user

#customizing the payload we get from our access tokens
class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
    @classmethod
    def get_token(cls, user):
        token = super().get_token(user)
        token['username'] = user.username
        token['first_name'] = user.first_name
        token['last_name'] = user.last_name
        token['country'] = user.country
        token['city'] = user.city
        token['bio'] = user.bio
        return token

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

admin.py

from django.contrib import admin
from django.contrib.auth import get_user_model
User = get_user_model()
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
    list_display = [field.name for field in User._meta.fields if field.name not in('id', 'qual_key', 'qual_desc')]
    list_display.insert(0, '__str__')

и api.py:

class RegisterApi(generics.GenericAPIView):
    serializer_class = RegisterSerializer
    #remove this if it doesn't work
    authentication_classes = (TokenAuthentication,)
    permission_classes = (AllowAny,)
    def post(self, request, *args,  **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.save()
        return Response({
            "user": UserSerializer(user, context=self.get_serializer_context()).data,
            "message": "User Created Successfully.  Now perform Login to get your token",
        })

чтобы показать вам структуру моего проекта, вот мой urls.py

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)

urlpatterns = [
    path('', include(router.urls)),
    path('admin/', admin.site.urls),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    path('api/token/', CustomTokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    path('api/token/verify/', TokenVerifyView.as_view(), name='token_verify'),
    path('api/register', RegisterApi.as_view()),
]

UPDATE

Вот мои настройки:

AUTH_USER_MODEL = 'accounts.CustomerUser'

Пояснение

Когда вы создаете пользовательскую модель пользователя, которая расширяет AbstractUser и имеет больше полей, чем модель по умолчанию User, вы должны создать для нее пользовательский менеджер модели. Пользовательский менеджер должен расширять BaseUserManager и реализовывать методы create_user и create_superuser, см. здесь.

Затем объявите пользовательский менеджер пользователей в CustomerUser модели

class CustomerUser(AbstractUser):
    ...

    objects = CustomerUserManager()
Вернуться на верх