扩展组模型的嵌套序列化程序缺少用户序列化程序中的某些字段

时间:2020-11-11 11:04:44

标签: django serialization django-rest-framework

我在我的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
}

我在做什么错?甚至有可能吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我没有覆盖 User 类中的 groups 字段。然后,由于要编写带有ID(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__'