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()),