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)
Вернуться на верх