django - 使用 pk 以外的属性识别 Django Rest Framework ModelSerializer ForeignKey
问题描述
我觉得这是一个超级基本的问题,但在 DRF 文档中找不到答案。
假设我有这样的models.py
设置:
#models.py
class Person(models.Model):
name = models.CharField(max_length=20)
address = models.CharField(max_length=20)
class House(models.Model):
name = models.CharField(max_length=20)
owner = models.ForeignKey(Person)
我有一个 ModelSerializer 设置如下:
#serializers.py
class House(serializers.ModelSerializer):
class Meta:
model = House
fields = '__all__'
我想要做的是能够POST
新建 House 对象,但不必提供Person 对象的 pk,我希望能够提供Person 对象的名称。
例如
post = {'name': 'Blue House', 'owner': 'Timothy'}
我使用的实际模型有几个 ForeignKey 字段,所以我想知道最规范的方法。
解决方案
一种解决方案可能是使用SlugRelatedField
#serializers.py
class House(serializers.ModelSerializer):
owner = serializers.SlugRelatedField(
slug_field="name", queryset=Person.objects.all(),
)
class Meta:
model = House
fields = '__all__'
不过,这也会改变您的序列化程序的表示形式,因此在您渲染它时它会显示 Person 的名称。如果您需要呈现 Person 的主键,那么您可以覆盖 House 序列化to_representation()
器方法,或者您可以通过继承 SlugRelatedField 并覆盖to_representation()
它来实现一个小的自定义序列化器字段。
推荐阅读
- css - 画布元素看起来像是被填充了,但是 css 说它不是
- java - 自定义编辑文本
- tsql - 我可以在合并语句中进行此计算吗?
- javascript - 为什么不能重写类的原型?
- webforms - 命名空间“Telerik”中不存在类型或命名空间名称“WinContols”
- php - 在列中回显 JSON 值
- javascript - getComputedStyle() 跨浏览器的一致性
- java - 在存在 XFF 标头的情况下将 `AuthenticationFailureBadCredentialsEvent` 与远程地址相关联
- abap - SAP Gateway:如何设置服务以直接访问 ABAP 功能,而不需要任何实体?
- google-bigquery - 如何在 BigQuery 中使用路径重命名列?