You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:06:04