Django REST Framework的RelatedField序列化器中如何获取ScreenCategory的id
实现方法
DRF 字段实例内置了序列化树层级访问属性,你可以直接通过字段的root属性拿到顶层父序列化器,进而获取父级实例ID:
self.root指向当前序列化树的最外层序列化器,即你的ScreenCategorySerializer实例self.root.instance就是当前正在序列化的ScreenCategory父级对象
最终代码
class ScreenCategorySerializer(serializers.ModelSerializer): screen = ScreenListingField(many=True, read_only=True) class Meta: model = ScreenCategory fields = ['id', 'title', 'screen', 'active', 'position'] class ScreenListingField(serializers.RelatedField): def to_representation(self, value): res = {} # 此处获取父级ScreenCategory的id screen_category_id = self.root.instance.id # 你可以按需使用screen_category_id变量,比如加到返回结果里 res['category_id'] = screen_category_id # 原有逻辑保持不变 res['id'] = value.id res['title'] = value.title res['layout'] = value.layout res['project'] = value.project.id res['last_change'] = value.last_change res['width'] = value.width res['height'] = value.height res['background_color'] = value.background_color res['constant_color'] = value.constant_color.id if value.constant_color else None res['styles'] = value.styles res['base'] = value.base return res
批量序列化兼容方案
如果你需要一次性序列化多个ScreenCategory实例(列表接口场景),此时self.root.instance会是实例查询集,推荐通过模型反向关联取值(前提是你的Screen模型有外键关联到ScreenCategory,该场景下性能更稳定):
def to_representation(self, value): # 列表场景通过反向外键直接取父级id,category换成你实际的外键字段名即可 screen_category_id = value.category.id # 剩余逻辑保持不变
内容的提问来源于stack exchange,提问作者Kabiljan Tanaguzov
相关产品推荐
相关产品推荐

