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

cod*_*y46 1 python django-rest-framework

模型:

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)
Run Code Online (Sandbox Code Playgroud)

序列化器:

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']
Run Code Online (Sandbox Code Playgroud)

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

[
    {
        "name": 1,
        "dob": "1990-05-19",
        "gender": 1
    }
]
Run Code Online (Sandbox Code Playgroud)

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

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

JPG*_*JPG 7

重写类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
Run Code Online (Sandbox Code Playgroud)