首页 > 解决方案 > 如何在 Django Rest Framework 中为外键显示字段值而不是 id,以确保所有字段都像以前一样在 DRF HTML 表单上显示

问题描述

模型:

class Person(models.Model):
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=20)
    
    def __str__(self):
        return self.first_name + ' ' + self.last_name
        
        
class Gender(models.Model):
    gender = models.CharField(max_length=1)
    
    def __str__(self):
        return self.gender
        
        
class Details(models.Model):
    name = models.ForeignKey(Person, on_delete=models.CASCADE)
    dob = models.DateField()
    gender = models.ForeignKey(Gender, on_delete=models.DO_NOTHING)

序列化器:

class PersonSerializer(serializers.ModelSerializer):

    class Meta:
        model = Person
        fields = '__all__'


class GenderSerializer(serializers.ModelSerializer):

    class Meta:
        model = Gender
        fields = '__all__'


class ProfileSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = Profile
        fields = ['name', 'dob', 'gender']

目前,我得到的输出低于上面的输出:

[
    {
        "name": 1,
        "dob": "1990-05-19",
        "gender": 1
    }
]

其中Person = "John Smith"id 1和性别的 id 1 是"Male"。我在stackoverflow上有几个解决方案,例如:

所有这些方法都有效,但是 Django Rest Framework 将外键设置为只读,并且这些字段不再出现在 DRF HTML 表单中。我的问题是如何显示外键字段值而不是 id 确保DRF HTML 表单仍然像之前一样显示这些字段

标签: pythondjango-rest-framework

解决方案


覆盖类的to_representation方法ProfileSerializer

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = ['name', 'dob', 'gender']

    def to_representation(self, instance):
        rep = super().to_representation(instance)
        rep['gender'] = GenderSerializer(instance.gender).data
        return rep

推荐阅读