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

如何在Django Rest Framework序列化器中获取当前登录用户ID

错误根因

你给get_inventory方法加了@staticmethod静态方法装饰器,这导致调用该方法时不会自动传入序列化器实例作为第一个参数,自然就拿不到绑定在序列化器上的request对象,触发参数缺失报错。


修复方案

  1. 首先删除@staticmethod装饰器,SerializerMethodField对应的取值方法默认第一个参数就是序列化器实例self,不需要定义为静态方法
  2. 可以把两次数据库查询合并为一次,减少数据库IO开销,提升接口性能

修复后的完整代码如下:

class CardsDataSerializers(serializers.ModelSerializer):
    inventory = serializers.SerializerMethodField()

    class Meta:
        model = magic_set_cards
        fields = ['id', 'name', 'rarity', 'manaCostList', 'convertedManaCost', 'colors', 'number',  'type', 'types', 'imageUri', 'promoTypes', 'hasFoil', 'hasNonFoil', 'inventory']

    def get_inventory(self, obj):
        user_id = self.request.user.id
        # 合并为一次查询,同时取standard和foil字段
        inventory_data = inventory_cards.objects.filter(user_id=user_id, card_id=obj.id).values('standard', 'foil').first()
        if not inventory_data:
            return {
                'standard': 0,
                'foil': 0
            }
        return {
            'standard': inventory_data['standard'],
            'foil': inventory_data['foil']
        }

额外注意

要确保序列化器实例化的时候,request对象被正确传入了序列化器的上下文:

  • DRF的CBV类视图会默认自动传递上下文,不需要额外处理
  • 如果你是手动实例化序列化器,需要手动传上下文参数:
serializer = CardsDataSerializers(queryset, many=True, context={"request": request})

内容的提问来源于stack exchange,提问作者Ross

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:09:03