Django REST Framework接口返回无数据 此前曾触发断言错误
问题根因
代码的核心错误是混淆了DRF序列化器两种场景的传参规则:
- 序列化(从数据库实例/查询集转成可返回的字典,对应GET读场景):第一个位置参数为
instance,传入要序列化的数据源 - 反序列化(从前端提交的数据校验后写入数据库,对应POST/PUT写场景):才需要传入
data参数接收提交内容
你当前是查询数据返回的读场景,却把查询集传给了data参数,此时调用is_valid()必然校验不通过,变量data始终为初始的None,所以接口返回无数据。此前的断言错误也大概率是序列化场景错误调用is_valid()导致的。
修复方案
1. 修正视图传参逻辑
序列化场景不需要传data参数,也不需要调用is_valid()做校验,直接读取序列化后的data属性即可:
@api_view(['GET']) def get_data(request): query_set = Organisation.objects.all() # 序列化操作传入instance参数 serialized_data = OrganisationSerializer(instance=query_set, many=True) return Response(serialized_data.data, status=status.HTTP_200_OK)
2. 序列化器可选优化(避免后续写接口踩坑)
如果嵌套字段仅作为读属性返回,不需要前端提交,建议加上read_only=True,避免反序列化场景要求必须传入嵌套字段值:
class OrganisationSerializer(ModelSerializer): products = ProductSerializer(many=True, read_only=True) #manytomany field pictures = PicturesSerializer(source ='pictures_set',many=True, read_only=True) #foreign key field class Meta: model = Organisation fields = ['name','address' ,'products','pictures']
内容的提问来源于stack exchange,提问作者Atif Shafi
相关产品推荐
相关产品推荐

