【发布时间】:2019-07-28 13:29:28
【问题描述】:
我想获取所有用户详细信息和所有角色的列表 用户详细信息模型 我的模型
class UserDetail(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE,
related_name='userdetail_user', default='111')
cn = models.CharField(max_length=200)
sn = models.CharField(max_length=200)
u_id = models.CharField(max_length=200)
display_name_cn = models.CharField(max_length=200)
display_name_en = models.CharField(max_length=200)
given_name = models.CharField(max_length=200)
employee_number = models.CharField(max_length=200)
email = models.CharField(max_length=200)
created_at = models.DateTimeField(default=datetime.now, blank=True)
last_login = models.DateTimeField(default=datetime.now, blank=True)
def __str__(self):
return self.given_name
class Role(models.Model):
title = models.CharField(max_length=20)
description = models.CharField(max_length=200)
created_at = models.DateTimeField(default=datetime.now, blank=True)
last_updated = models.DateTimeField(default=datetime.now, blank=True)
status = models.BooleanField(default=True)
def __str__(self):
return self.title
class UserRole(models.Model):
userdetail = models.ForeignKey(UserDetail, on_delete=models.CASCADE,
related_name='userrole_userdetail')
role = models.ForeignKey(Role, on_delete=models.CASCADE)
approver = models.ForeignKey(UserDetail, on_delete=models.SET_NULL,
null=True,
related_name='userrole_userdetail_approver')
created_at = models.DateTimeField(default=datetime.now, blank=True)
last_updated = models.DateTimeField(default=datetime.now, blank=True)
status = models.BooleanField(default=True)
我的序列化器
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email')
class UserRoleSerializer(serializers.ModelSerializer):
class Meta:
model = UserRole
fields = (
'id', 'userdetail', 'role', 'approver', 'last_updated', 'status')
depth = 1
def to_representation(self, instance):
representation = super(UserRoleSerializer, self).to_representation(
instance)
representation['userdetail'] = UserDetailSerializer(
instance.userdetail).data
representation['role'] = RoleSerializer(instance.role).data
representation['approver'] = UserDetailSerializer(
instance.approver).data
return representation
class RoleSerializer(serializers.ModelSerializer):
class Meta:
model = Role
fields = ('id', 'title', 'description', 'last_updated', 'status')
class UserDetailSerializer(serializers.ModelSerializer):
user = UserSerializer()
roles = serializers.SerializerMethodField(read_only=True)
class Meta:
model = UserDetail
fields = ('id', 'roles', 'user', 'cn', 'sn', 'u_id', 'display_name_cn',
'display_name_en', 'given_name', 'employee_number', 'email',
'last_login')
lookup_field = 'u_id'
def get_roles(self, obj):
roles = UserRole.objects.filter(userdetail=obj)
return roles
当我尝试获取所有用户详细信息时,它给了我一个错误 “'UserRole' 类型的对象不是 JSON 可序列化的”。
我已经尝试序列化在 UserDetailsSerializer 的 get_roles 方法中获取的对象列表,但没有帮助
【问题讨论】:
-
在 UserDetailSerializer 中尝试:
roles=UserRoleSerializer(many=True, read_only=True) -
@DovRine 已经尝试消除错误,但在 user_detail api 中仍然没有显示任何角色
-
这绝对是序列化角色的正确方法。我会尝试消除所有内容并一次填充 user_detail_api 响应。如果这就是你现在所在的位置,并且只剩下角色,那么,我会制作一个非常简单的序列化程序,它不会过滤角色,只是为了让它们出现。一旦工作,更换过滤器。如果你不能让简单的序列化器工作,问题可能出在视图中。
-
顺便说一句,您可能还需要在 UserRoleSerializer 中指定
role=RoleSerializer()。 -
UserRoleSerializer 引用 UserDetailSerializer 再次引用 UserRoleSerializer (在我的修复中)。正如我之前提到的,我认为您需要简化序列化程序。当我不得不解决一个比我最初想象的更复杂的问题时,我遇到了这个问题。有时,重新考虑这里的数据设计会有所帮助。
标签: django django-rest-framework active-model-serializers