Django rest 从桥模型中获取数据

Django rest fetch data from bridge model

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

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

当我尝试获取所有用户详细信息时,出现错误 "Object of type 'UserRole' is not JSON serializable".

我已经尝试序列化在 UserDetailsS​​erializer 的 get_roles 方法中获取的对象列表,但它没有帮助

在你的序列化程序中,你必须替换

 roles = serializers.SerializerMethodField(read_only=True)

userrole_userdetail = UserRoleSerializer(many=True, read_only=True)

这是因为你的FK关系名称必须与模型中给定的相关名称相匹配。同样在 UserRoleSerializer 中,您不需要 to_representation 方法。