Django DRF按Choice字段筛选数据报get_object参数数量不匹配错误
问题修复方案
1. 直接报错原因
你触发TypeError: get_object() takes 1 positional argument but 2 were given的原因是:
定义get_object方法时,你仅设置了self和关键字参数**kwargs作为入参,但调用时直接传入了位置参数kwargs.get('help_type'),相当于给方法传入了2个位置参数(默认隐式传入的self+你手动传的字符串值),和你定义的方法入参规则不匹配,所以触发参数数量错误。
2. 待修正的其他逻辑问题
还有两个隐藏的逻辑错误会导致你即使修复参数报错也拿不到预期结果:
- 你需要查询所有符合筛选条件的帖子,不能用
Post.objects.get(),该方法只能返回单条数据,匹配多条/零条数据时都会直接报错,应该使用filter()方法查询数据集 - 你的
help_typeChoice字段在数据库中实际存储的是元组第一个位置的值("1"、"2"这类数字字符串),但你URL传入的是元组第二个位置的显示名(Oxygen、Plasma),直接过滤会查不到任何结果,需要先做值映射
3. 修复后的完整代码
3.1 视图层修改
class PostRestApi(APIView): # 提前定义显示名到数据库存储值的映射关系 HELP_TYPE_MAP = { "Plasma": "1", "Oxygen": "2", "Bed": "3", "Emergency": "4" } def get_queryset(self, help_type_name): # 把URL传入的显示名转换为数据库存储的数值 help_type_val = self.HELP_TYPE_MAP.get(help_type_name) if not help_type_val: raise Http404 # 过滤所有符合条件的帖子 return Post.objects.filter(help_type=help_type_val) def get(self, request, **kwargs): help_type = kwargs.get('help_type') posts = self.get_queryset(help_type) # 多条数据序列化必须加many=True参数 serializer = PostSerializer(posts, many=True) return Response(serializer.data)
3.2 序列化器可选优化
如果你需要接口返回的help_type是Oxygen这类用户可读的显示名,而不是数据库存储的数字字符串,可以修改序列化器:
class PostSerializer(serializers.Serializer): title = serializers.CharField(max_length = 100) content = serializers.CharField() date = serializers.DateTimeField(default=timezone.now) # 用SerializerMethodField返回choice的显示值 help_type = serializers.SerializerMethodField() def get_help_type(self, obj): return obj.get_help_type_display()
内容的提问来源于stack exchange,提问作者Vishal Patil
相关产品推荐
相关产品推荐

