【问题标题】:The nested serializer of extended group model is missing some fields in the user serializer扩展组模型的嵌套序列化程序在用户序列化程序中缺少某些字段
【发布时间】:2020-11-11 11:04:44
【问题描述】:

我在我的 models.py 中扩展了 Group 模型并创建了相应的序列化程序,它工作正常。但是,当我尝试在用户序列化程序中序列化组字段时,我只获得默认字段。 让我展示部分代码:

models.py

class GroupExtended(Group):
    description =  models.TextField(blank=True)
    digitaltwin_permissions = models.ManyToManyField(
        to = DigitaltwinPermission,
        blank = True,
        default = None,
        related_name = "gemelo"
    )
    panel_permissions = models.ManyToManyField(
        to = PanelPermission,
        blank = True,
        default = None,
        related_name = "panel"
    )

    def __str__(self):
        return str(self.name)

    class Meta:
        verbose_name_plural = "4. Grupos"

serializer.py

class GroupExtendedSerializer(serializers.ModelSerializer):
    digitaltwin_permissions = DTPSerializer(read_only=True, many=True)
    panel_permissions = PPSerializer(read_only=True, many=True)
    class Meta:
        model = GroupExtended
        fields = ['id','name','description','digitaltwin_permissions','panel_permissions','permissions']

class UserSerializer(serializers.ModelSerializer):
    groups = GroupExtendedSerializer(read_only=True, many=True)
    class Meta:
        model = User
        fields = '__all__'

我通过用户 API 获得的是以下 JSON:

{
"id":1,
"groups":[
   {"id":2,
    "name":"Admin",
    "permissions":[]}
],
etc
}

相反,我想获得:

{
"id":1,
"groups":[
   {"id":2,
    "name":"Admin",
    "permissions":[],
    "description": "whatever",
    "digitaltwin_permissions":[*serialized fields*],
    "panel_permissions": [*serialized fields*]
}
],
etc
}

我做错了什么?有没有可能?

谢谢!

【问题讨论】:

  • 在你的 models.py 中,你不想要 null=True 而不是 blank=True 吗?
  • 我觉得对我来说没关系,也不影响序列化器。

标签: django serialization django-rest-framework


【解决方案1】:

我错过了覆盖 User 类中的 groups 字段。然后,我不得不更改用户序列化程序,因为我想用 ids (group_ids) 编写组。最后,代码是:

models.py

class GroupExtended(Group):
    description =  models.TextField(blank=True)
    digitaltwin_permissions = models.ManyToManyField(
        to = DigitaltwinPermission,
        blank = True,
        default = None,
        related_name = "gemelo"
    )
    panel_permissions = models.ManyToManyField(
        to = PanelPermission,
        blank = True,
        default = None,
        related_name = "panel"
    )

class User(AbstractUser):
    avatar = models.ForeignKey(
        Avatar, 
        on_delete = models.CASCADE,
        blank = True,
        null = True
    )

    groups = models.ManyToManyField(
        to = GroupExtended,
        blank = True
    )

serializers.py

class GroupExtendedSerializer(serializers.ModelSerializer):
    digitaltwin_permissions = DTPSerializer(read_only=True, many=True)
    digitaltwin_permissions_ids = serializers.PrimaryKeyRelatedField(
        many=True,  
        read_only=False, 
        queryset = DigitaltwinPermission.objects.all(),
        source = 'digitaltwin_permissions'
    )
    panel_permissions = PPSerializer(read_only=True, many=True)
    panel_permissions_ids = serializers.PrimaryKeyRelatedField(
        many=True,  
        read_only=False, 
        queryset = PanelPermission.objects.all(),
        source = 'panel_permissions'
    )
    class Meta:
        model = GroupExtended
        fields = '__all__'
        depth = 8

class UserSerializer(serializers.ModelSerializer):
    avatar = AvatarSerializer(read_only=True)
    avatar_id = serializers.IntegerField()
    groups = GroupExtendedSerializer(read_only=True, many=True)
    groups_ids = serializers.PrimaryKeyRelatedField(
        many=True,  
        read_only=False, 
        queryset = GroupExtended.objects.all(),
        source = 'groups'
    )

    class Meta:
        model = User
        fields = '__all__'

【讨论】:

    猜你喜欢
    • 2017-03-10
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多