DRF 嵌套序列化器返回空字典

问题描述 投票:0回答:3

我有两个模态指定和 UserModal

class DesignationModal(models.Model):
    designation=models.CharField(max_length=100)

    def __str__(self):
        return self.designation



class UserModal(AbstractUser):
    username=models.CharField(max_length=300,unique=True)
    password=models.CharField(max_length=300)
    email=models.EmailField(max_length=300)
    designation=models.ForeignKey(DesignationModal,on_delete=models.CASCADE,
                              related_name="desig",null=True)

    def __str__(self):
        return self.username

每个用户只有一个称号。我为此编写了序列化器。

class DesignationSerializer(serializers.Serializer):
    class Meta:
        model=DesignationModal
        fields=['designation','id']

class UserSerializer(serializers.ModelSerializer):
    designation=DesignationSerializer(read_only=True,many=False)

    class Meta:
        model=UserModal
        fields=['id', 'username','designation']

我收到这样的 JSON 响应

{
"status": true,
"data": [
    
    {
        "id": 3,
        "username": "akhil",
        "designation": {}
    }
]

}

当我像这样重写序列化器代码时,字典中没有值。

class UserSerializer(serializers.ModelSerializer):
    designation=serializers.StringRelatedField()
    
    class Meta:
        model=UserModal
        fields=['id', 'username','designation']

我正在获取字符串形式的指定值

{
"status": true,
"data": [
   
    {
        "id": 3,
        "username": "akhil",
        "designation": "agent"
    }
]

}

为什么我没有以以前的方式获得值?

django django-models django-rest-framework django-views django-serializer
3个回答
0
投票

使用 深度 选项将获取嵌套值。

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserModal
        fields = ['username', 'email', 'designation', ]
        depth = 1

0
投票

DesignationSerializer(serializers.Serializer) 的继承不好,你需要像这样改变它

class DesignationSerializer(serializers.ModelSerializer):
    class Meta:
        model=DesignationModal
        fields=['designation','id']

0
投票

文档中没有明确说明这一点,但嵌套的

ModelSerializer
字段需要与模型中相应
related_name
字段的
ForeignKey
相匹配。

在这种情况下

related_name="designation"
应该按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.