![](/img/trans.png)
[英]django-rest-framework- accepting id for submitted foreign key field
[英]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.