Менеджер недоступен 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()