django - Django rest框架序列化器 - 多次序列化单个模型字段
问题描述
我想在输出 json 中多次序列化一个相关字段。第一个应该包含pk
相关对象,第二个表示应该是超链接。有什么花哨的方法吗?我知道SerializerMethodField
,但我觉得它不优雅。
我的模型:
class Person(models.Model):
first_name = models.CharField()
...
class Order(models.Model):
title = models.CharField()
person = models.ForeignKey(Person, related_name='orders')
我想要的是:
像这样序列化我的 Order 模型:
{
"title": "Alice in wonderland",
"person": 1, # represents persons's primary key
"person_url": "/person-detail/1"
}
我试过的/我的序列化器:
class OrderSerializer(serializers.ModelSerializer):
person = serializers.IntegerField()
person_url = serializers.HyperlinkedRelatedField(
view_name='myapp:user-profile',
lookup_field='pk'
)
class Meta:
model = Order
fields = ['title', 'person', 'person_url']
read_only_fields = ('__all__',)
但在这种情况下,Django 在逻辑上对person_url
数据库中缺少的字段感到不满。如何进行?
解决方案
你的方法非常接近。几点注意事项:
- 如果你想要 pk,你不需要指定
person
整数字段,你可以免费获得(ModelSerializer
将自动创建一个PrimaryKeyRelatedField
被调用的person
) - 您不必在
fields
此处指定。DRF 为您提供自动生成的以及序列化程序上明确定义的字段 lookup_field
默认为pk
- 假设您的视图名称是正确的(我看不到您的网址),您所缺少的
HyperlinkRelatedField
只是一个source
属性
放在一起,这样的事情应该可以工作:
class OrderSerializer(serializers.ModelSerializer):
person_url = serializers.HyperlinkedRelatedField(
view_name='myapp:user-profile',
source='person',
read_only=True
)
class Meta:
model = Order
fields='__all__'
read_only_fields = ('__all__',)
注意:对于我的 urls.py,我有一个看起来更像person-detail
.
推荐阅读
- php - MySQL 同时选择多个 id 可选 id 和 php
- python - Seaborn displot - 当绘图有直方图和 KDE 时,y 轴是否可以设置为显示密度
- android - Firestore 测试回调
- python - Visual Studio代码python扩展错误
- wordpress - 是否可以将 ACF 或 Pods 中的自定义字段调用到函数中?
- python - 获取列表中矩阵的项索引和行索引到矩阵
- pexpect - 出现错误:未安装 pexpect,尝试:pip install pexpect
- google-sheets - 如何在给定函数上获取返回 True 的行中的第一个元素
- google-apps-script - 我的应用程序脚本中的 forEach 函数显示未定义:尝试自动完成表单下拉列表
- linux - 将 isciadm 配置为在另一个 iscsi-portal 关闭时回退到另一个 iscsi-portal