django - 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”方法可以按预期完美运行。整个模型字段都在工作,这只是一种行不通的方法。我该如何解决这个问题?
解决方案
这是因为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'
]
推荐阅读
- azure-cosmosdb - 如何将数据从 cosmosdb 导出到 .json 文件
- android - 如何自动安装 WearOS 配套应用程序和 Android 手机应用程序
- java - 我想从输入字符串“a2re45pr456#$#$80”中提取整数
- javascript - 为 N 个单元格的网格找到最佳行和列
- sql - 插入多行,获取 id,并对此 id 执行操作
- javascript - 为什么我的 Angular 路由模块不能使用参数?
- android - Android NDK (libgcc_real.a) 上“__aeabi_ul2f”的多重定义
- azure-devops - 在 azure devops 模板中打印模板参数
- batch-file - 根据部分文件名将文件移动到目录
- javascript - 具有作为类实例的键的对象的 JSDoc