【问题标题】:Django rest fetch data from bridge modelDjango rest 从桥模型中获取数据
【发布时间】: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 可序列化的”。

我已经尝试序列化在 UserDetailsS​​erializer 的 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


【解决方案1】:

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

 roles = serializers.SerializerMethodField(read_only=True)

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

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

【讨论】:

    猜你喜欢
    • 2020-09-19
    • 2021-06-07
    • 2023-04-09
    • 2020-09-13
    • 1970-01-01
    • 2016-08-11
    • 2022-11-27
    • 1970-01-01
    • 2018-04-17
    相关资源
    最近更新 更多