【问题标题】: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如何在 Django Rest Framework 中为外键显示字段值而不是 id,以确保所有字段都像以前一样在 DRF HTML 表单上显示
【发布时间】:2021-01-10 21:20:09
【问题描述】:

型号:

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 代表 Person = "John Smith"id 1 代表性别是 "Male" .我在stackoverflow上有几个解决方案,例如:

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

【问题讨论】:

    标签: python django-rest-framework


    【解决方案1】:

    重写 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
    

    【讨论】:

    【解决方案2】:

    如果你不想覆盖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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      • 2019-06-26
      • 2012-02-20
      • 2023-03-05
      • 2017-03-25
      • 2019-01-17
      • 1970-01-01
      相关资源
      最近更新 更多