python - 如何在 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 表单仍然像之前一样显示这些字段
解决方案
覆盖类的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
推荐阅读
- ms-access - 如何在连接表中使用复合 PK 在 MS Access DB 中实施审计跟踪?
- python - pygame sprite 似乎是拉伸/增长而不是沿 x 轴移动
- angular - 带有 Angular 7 的 iPad 版 Chrome 上的 Favicon 问题?
- python - 使用 PySwip 从 python 查询 Prolog 数据库
- javascript - 我正在尝试通过属性和一行 javascript 设置一个不可见的通用元素
- linux - 如何在 bash 转义空格中获取键值配对文件?
- google-app-engine - 如何防止已部署的 App 引擎应用程序中的文件缓存?
- django - 如何将受邀用户与邀请人的公司/组关联?
- google-apps-script - 如何在 Google Apps 脚本 Web 应用程序中执行子页面
- javascript - 我应该在反应中使用带有 HOC 的柯里化吗?