TypeError: Объект типа User не является JSON сериализуемым

Я совсем новичок в Django и создаю простую реферальную систему, в которой код генерируется автоматически для пользователя, и когда этот код вызывается, API должен вернуть пользователя, который был направлен этим кодом. Однако я испытываю некоторые трудности с возвратом имени пользователя, получая ошибку TypeError: Object of type User is not JSON serializable. Ниже я привожу свой код (пожалуйста, не обращайте внимания на неиспользуемые импорты, я пробовал много вещей, и мне нужно очистить код позже)

views.py `

from rest_framework.decorators import api_view
from rest_framework.response import Response
import json, requests
from rest_framework.views import APIView
from django.http import JsonResponse, HttpResponse
from django.core import serializers
from django.core.serializers import serialize
import ast
from rest_framework.parsers import JSONParser


class MainView(APIView):
    def post(self, request):
        code = request.data["ref_code"]
        print(str(code))
        try:
            profile = ReferralSys.objects.get(code=code)
            print(profile)
            request.session["ref_profile"] = profile.user
            username = profile.user.username
            print(username)
            print(type(username))
            # return HttpResponse("user is here", user)
        except:
            pass
            print(request.session.get_expiry_date())
        return Response(f"{profile.user.username}")

models.py

from django.db import models
from django.contrib.auth.models import User
from .utils import generate_ref_code


class ReferralSys(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(blank=True)
    code = models.CharField(max_length=12, blank=True)
    recommented_by = models.ForeignKey(
        User, on_delete=models.CASCADE, blank=True, null=True, related_name="ref_by"
    )
    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.user.username}-{self.code}"

    def get_recommended_profiles(self):
        pass

    def save(self, *args, **kwargs):
        if self.code == "":
            code = generate_ref_code()
            self.code = code
        super().save(*args, **kwargs)

utils.py

import uuid


def generate_ref_code():
    code = str(uuid.uuid4()).replace("-", "")[:12]
    return code

urls.py

from django.contrib import admin
from django.urls import path
from .views import MainView


urlpatterns = [
    path("admin/", admin.site.urls),
    path("", MainView.as_view()),
    path("str:<ref_code>", MainView.as_view()),
]

Заранее благодарю за помощь.

PS: Я следую этому руководству https://www.youtube.com/watch?v=QZfflGvRQrc&t, но вместо шаблонов я хочу использовать APIView.

Что происходит: сессии Django сериализуют данные с помощью JSON. При написании:

request.session["ref_profile"] = profile.user

Вы пытаетесь вставить модель внутри сессии, поэтому возникает ошибка. Один из основных и простых способов - разобрать нужные данные в JSON:

from rest_framework.response import Response
from rest_framework.views import APIView
from .models import ReferralSys
import json

class MainView(APIView):
    def post(self, request, code):
        try:
            profile = ReferralSys.objects.get(code=code)
            user = {
                'username': profile.user.username,
                'email': profile.user.email
            }
            user_json = json.dumps(user)
            request.session["ref_profile"] = user_json

        except:
            pass
            print(request.session.get_expiry_date())
        return Response(f"{profile.user.username}")

Конечно, есть компромиссы, и я рекомендую вам прочитать документацию, чтобы понять их. Есть также еще одна ошибка в виде того, как вы передаете (и получаете) дополнительный аргумент ключевого слова в URL, правильный синтакс:

path("<str:code>/", MainView.as_view()),
Вернуться на верх