簡體   English   中英

如何在 Django Rest Framework 中顯示外鍵的字段值而不是 id 確保所有字段都像以前一樣在 DRF HTML 表單上顯示

[英]How to display field value instead of id for foreign key in Django Rest Framework ensuring all fields being displayed as before on DRF HTML form

模型:

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
    }
]

其中對於人=“約翰·史密斯”和性別id為1的id 1“男性”。 我在 stackoverflow 上得到了幾個解決方案,例如:

所有這些方法都有效,但是 Django Rest Framework 將外鍵設為只讀,並且這些字段在 DRF HTML 表單中不再可見。 我的問題是如何顯示外鍵字段值而不是 id 確保DRF HTML 表單仍然像以前一樣顯示這些字段

覆蓋ProfileSerializer類的to_representation方法

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

如果您不想覆蓋to_representation() ,您可以創建一個SerializerMethodField

class ProfileSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()

    class Meta:
        model = Profile
        fields = ['name', 'dob', 'gender']

    # this method is called to get the value of field `name`
    def get_name(self, profile):
          return profile.name.name

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM