如何在Django Rest Framework序列化器中获取当前登录用户ID
错误根因
你给get_inventory方法加了@staticmethod静态方法装饰器,这导致调用该方法时不会自动传入序列化器实例作为第一个参数,自然就拿不到绑定在序列化器上的request对象,触发参数缺失报错。
修复方案
- 首先删除
@staticmethod装饰器,SerializerMethodField对应的取值方法默认第一个参数就是序列化器实例self,不需要定义为静态方法 - 可以把两次数据库查询合并为一次,减少数据库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
相关产品推荐
相关产品推荐

