Django rest从桥模型获取数据

Django rest从桥模型获取数据,django,django-rest-framework,active-model-serializers,Django,Django Rest Framework,Active Model Serializers,我想获得所有用户的详细信息和所有角色的列表 用户详细信息模型 我的模型 类用户详细信息(models.Model): user=models.OneToOneField(用户,在_delete=models.CASCADE上, 相关的(默认值为111) cn=models.CharField(最大长度=200) sn=型号.字符域(最大长度=200) u_id=models.CharField(最大长度=200) 显示\u name\u cn=models.CharField(最大长度=200)

我想获得所有用户的详细信息和所有角色的列表 用户详细信息模型 我的模型

类用户详细信息(models.Model):
user=models.OneToOneField(用户,在_delete=models.CASCADE上,
相关的(默认值为111)
cn=models.CharField(最大长度=200)
sn=型号.字符域(最大长度=200)
u_id=models.CharField(最大长度=200)
显示\u name\u cn=models.CharField(最大长度=200)
显示\u name\u en=models.CharField(最大长度=200)
给定的名称=models.CharField(最大长度=200)
员工编号=型号.CharField(最大长度=200)
email=models.CharField(最大长度=200)
已创建\u at=models.DateTimeField(默认值=datetime.now,blank=True)
上次登录=models.DateTimeField(默认值=datetime.now,blank=True)
定义(自我):
返回自己的给定名称
班级角色(models.Model):
title=models.CharField(最大长度=20)
description=models.CharField(最大长度=200)
已创建\u at=models.DateTimeField(默认值=datetime.now,blank=True)
上次更新=models.DateTimeField(默认值=datetime.now,blank=True)
status=models.BooleanField(默认值=True)
定义(自我):
返回自己的标题
类UserRole(models.Model):
userdetail=models.ForeignKey(userdetail,on_delete=models.CASCADE,
相关的\u name='userrole\u userdetail')
role=models.ForeignKey(role,on_delete=models.CASCADE)
approver=models.ForeignKey(UserDetail,on\u delete=models.SET\u NULL,
空=真,
相关\u name='userrole\u userdetail\u approver')
已创建\u at=models.DateTimeField(默认值=datetime.now,blank=True)
上次更新=models.DateTimeField(默认值=datetime.now,blank=True)
status=models.BooleanField(默认值=True)
我的序列化程序

class UserSerializer(serializers.ModelSerializer):
类元:
模型=用户
字段=('id','username','email')
类UserRoleSerializer(serializers.ModelSerializer):
类元:
模型=用户角色
字段=(
‘id’、‘userdetail’、‘角色’、‘审批人’、‘上次更新’、‘状态’)
深度=1
def到_表示(自身、实例):
表示=超级(UserRoleSerializer,self)。到\u表示(
(实例)
表示['userdetail']=UserDetailSerializer(
实例。userdetail)。数据
表示['role']=RoleSerializer(instance.role).data
表示['approver']=UserDetailSerializer(
实例。批准者)。数据
返回表示
类RoleSerializer(serializers.ModelSerializer):
类元:
模型=角色
字段=('id','title','description','last_updated','status')
类UserDetailSerializer(serializers.ModelSerializer):
user=UserSerializer()
roles=serializers.SerializerMethodField(只读=True)
类元:
model=UserDetail
字段=('id','roles','user','cn','sn','u\u id','display\u name\u cn',
“显示姓名”、“给定姓名”、“员工编号”、“电子邮件”,
'上次登录')
查找\u字段='u\u id'
def get_角色(自我、obj):
roles=UserRole.objects.filter(userdetail=obj)
返回角色
当我尝试获取所有用户详细信息时,它会给我一个错误 “UserRole类型的对象不可JSON序列化”


我已经尝试序列化在UserDetailsSerializer的get_roles方法中获取的对象列表,但是没有任何帮助

在序列化程序中,您必须替换

 roles = serializers.SerializerMethodField(read_only=True)


这是因为您的FK关系名称必须与模型中给定的相关名称匹配。另外,在UserRoleSerializer中,您不需要使用to_表示法。

在UserDetailSerializer中,请尝试:
roles=UserRoleSerializer(many=True,read\u only=True)
@DovRine已经尝试过删除错误,但仍然不在用户详细信息中显示任何角色,这绝对是序列化角色的正确方法。我会尝试消除一切,一次一个地填充用户\u细节\u api响应。如果这就是你现在所处的位置,只剩下角色了,那么,我将制作一个非常简单的序列化程序,它不会过滤角色,只是为了让它们显示出来。一旦工作正常,更换过滤器。如果无法使简单序列化程序正常工作,问题可能在视图中。顺便说一句,您可能还需要在UserRoleSerializer.UserRoleSerializer引用UserDetailSerializer中指定
role=RoleSerializer()
,它再次引用UserRoleSerializer(在我的修复中)。正如我前面提到的,我认为您需要简化序列化程序。当我不得不破解一个比我最初想象的更复杂的问题时,我就遇到了这个问题。有时候,重新思考这里的数据设计会有所帮助。
userrole_userdetail = UserRoleSerializer(many=True, read_only=True)