如果一个 Model 中存在与其他 Model 的关系字段,则 DRF 的 serializer 有两种方式为它们进行序列化:
- 使用
rest_framework.serializer中的RelatedField,如 PrimaryKeyRelatedField 以及 HyperlinkRelatedField - 使用Nested Representation
RelatedField 的共同之处是使用某种标识符来指向所关联的 Model 的实例,而几乎不涉及关联的实例本身的信息( SlugRelatedField 除外,但文档中也指出 Slug Field 最好指定 unique=True,因而某种意义上也是标识符)。而 Nested Representation 则是将所关联的实例的部分甚至全部信息也序列化并输出。
这两种方式各有优缺点。使用 RelatedField 无法得到所关联的对象的信息,如果需要这些信息,前端就需要额外发起请求,带来不必要的连接开销,但优势在于 PrimaryKeyRelatedField/SlugRelatedField/HyperlinkedRelatedField 默认都是 read-write 的。如果创建的 Serializer 需要承担更新、创建新对象等写操作,可以省去大量代码。Nested Representation 能获取到所关联对象的完整信息,便于前端进行数据展示,但 Nested Representation 默认是 ReadOnly 的,如果需要它承担写操作,必须自行编写 create 和 update 方法,这将会带来很多不必要的代码量。
因此我现在的解决方案是对同一个 Model 的读和写操作分别创建不同的 Serializer,读操作使用 Nested Representation,写操作使用 PrimaryKeyRelatedField。
请问我的理解与做法是否有什么问题?是否有其他的最佳实践呢?非常感谢!