Django - Сериализованная модель типа User не является JSON-сериализуемой
В настоящее время я пытаюсь выяснить, как настроить API для моего приложения, используя django rest framework. В настоящее время у меня есть следующие два файла:
serializers.py:
from rest_framework import serializers, permissions
from App_Accounts.models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('user',)
views.py
from rest_framework import permissions
from rest_framework.decorators import api_view, permission_classes
from rest_framework.response import Response
@api_view(['GET'])
@permission_classes((permissions.AllowAny,))
def current_user(request):
user = request.user
return Response({
'user': user,
})
Когда я открываю: http://localhost/api/current_user/, в консоли появляется следующая ошибка:
File "/usr/local/lib/python3.9/json/encoder.py", line 179, in default
raise TypeError(f'Object of type {o.__class__.__name__} ' TypeError: Object of type User is not JSON serializable
Я не знаю, насколько это важно, но я использую пользовательскую модель User
models.py
class User(AbstractBaseUser):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
user = models.CharField(max_length=15, unique=True, verbose_name=_("Username"))
avatar = models.ImageField(
null=True,
blank=True,
upload_to=get_file_path_user_avatar,
validators=[default_image_size, default_image_file_extension],
)
avatar_tn = models.ImageField(
null=True,
blank=True,
upload_to=get_file_path_user_avatar,
)
# Account types
active = models.BooleanField(default=True)
staff = models.BooleanField(default=False) # a admin user; non super-user
admin = models.BooleanField(default=False) # a superuser
# notice the absence of a "Password field", that's built in.
USERNAME_FIELD = 'user'
REQUIRED_FIELDS = [] # Username & Password are required by default.
def get_name(self):
# The user is identified by their Username ;)
return self.user
def __str__(self):
return self.user
def has_perm(self, perm, obj=None):
"""Does the user have a specific permission?"""
# Simplest possible answer: Yes, always
return True
def has_module_perms(self, app_label):
"""Does the user have permissions to view the app `app_label`?"""
# Simplest possible answer: Yes, always
return True
@property
def is_staff(self):
"""Is the user a member of staff?"""
return self.staff
@property
def is_admin(self):
"""Is the user a admin member?"""
return self.admin
@property
def is_active(self):
"""Is the user active?"""
return self.active
@property
def is_superuser(self):
return self.is_admin
@classmethod
def get_indexable(cls):
return cls.objects.all()
@classmethod
def configure_mapping(cls, mapping):
# mapping is an elasticsearch_dsl Mapping object
mapping.field('user', 'string')
return mapping
objects = UserManager()
AUTH_USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', User)
Хорошо, у меня получилось вот так:
в моем файле views.py я делаю:
@api_view(['GET',])
def current_user(request):
if request.method == 'GET':
users = User.objects.all()
user_serializer = UserSerializer(users, many=True)
return JsonResponse(user_serializer.data, safe=False)
в serializers.py я делаю:
class UserSerializer(serializers.ModelSerializer):
id = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())
class Meta:
model = User
fields = ('user', 'id')
Это возвращает мне следующий JSON:
[
{
"user": "admin",
"id": "b910aa3e-7716-467e-8ec6-dd3a545663f0"
}
]
Я вижу, что вы не использовали встроенный сериализатор UserSerializer
в вашем представлении, попробуйте обновить ваше представление:
@api_view(['GET'])
@permission_classes((permissions.AllowAny,))
def current_user(request):
serializer = UserSerializer(request.user)
Response(serializer.data)