首页 > 解决方案 > Django Rest Framework 方法返回用户类型的对象不是 JSON 可序列化的

问题描述

所以基本上我有一个 django 方法,我将它传递给我的序列化程序,但它返回错误User 类型的 Object is not JSON serializable这是我的文件:

模型.py:

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


class Profile(models.Model):
    first_name = models.CharField(max_length=50, blank=True)
    last_name = models.CharField(max_length=50, blank=True)
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    friends = models.ManyToManyField(User, blank=True, related_name='friends')

    def friends_list(self):
        return self.friends.all()

    def number_of_friends(self):
        return self.friends.all().count()

序列化器.py:

from rest_framework import serializers
from .models import Profile


class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = [
            'id',
            'first_name',
            'last_name',
            'user',
            'friends',
            'number_of_friends',
            'friends_list'
        ]

问题与“friends_list”方法有关,因为“number_of_friends”方法可以按预期完美运行。整个模型字段都在工作,这只是一种行不通的方法。我该如何解决这个问题?

标签: djangodjango-modelsdjango-rest-framework

解决方案


这是因为friends_list(...)返回QuerySet对象和 DRF 的方法无法序列化相同的对象。

为此,您需要使用serializers.SerializerMethodField以及单独的序列化程序类来序列化User对象

from rest_framework import serializers
from .models import Profile


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ("username", "first_name", "email")


class ProfileSerializer(serializers.ModelSerializer):
    friends_list = serializers.SerializerMethodField()

    def get_friends_list(self, profile):
        return UserSerializer(profile.friends_list(), many=True).data

    class Meta:
        model = Profile
        fields = [
            'id',
            'first_name',
            'last_name',
            'user',
            'friends',
            'number_of_friends',
            'friends_list'
        ]

推荐阅读