Python3.9+Django3.1.6环境下Django模型@property字段无法在DRF中序列化返回数据的解决问询
解决 Django 序列化器返回空数据的问题
看起来你遇到的核心问题有两个:一是序列化多个对象时未指定 many=True 参数,二是模型属性方法里存在一处潜在的逻辑漏洞。下面一步步帮你修复:
1. 修复序列化器调用的关键参数
在你的 PercentagesAPI 视图的 get 方法中,当传入的是 QuerySet(多个 Check 对象集合)时,必须明确告诉序列化器要处理多个实例。默认情况下序列化器只处理单个对象,忽略这个参数会导致无法解析批量数据,最终返回空的 response.data。
修改 views.py 中的序列化器调用代码:
# 原代码 response = self.serializer(lista) # 修改后 response = self.serializer(lista, many=True)
2. 修复模型属性方法的逻辑问题
看你的 total_body_fat_percentage 属性方法,男性分支的计算结果没有显式转为浮点型,虽然Python会自动处理,但为了保证返回值类型统一(和女性分支保持一致),建议统一转换;另外多余的 pass 可以删掉:
@property def total_body_fat_percentage(self): if self.client_gender == "M": total_body_fat_percentage = float((self.Yuhasz * 0.097) + 3.64) else: total_body_fat_percentage = float((self.Yuhasz * 0.1429) + 4.56) return total_body_fat_percentage
同时,为了避免 muscle_weight_percentage 方法出现除以0的错误,建议增加安全判断:
@property def muscle_weight_percentage(self): if self.weight == 0: return 0.0 # 或者根据业务需求抛出异常 return float(self.muscle_weight * 100 / self.weight)
3. 优化视图的冗余代码
DRF的序列化器已经内置了JSON序列化处理,你不需要手动调用 json.dumps。另外建议将序列化器属性命名为规范的 serializer_class,修改后的视图代码如下:
class PercentagesAPI(APIView): authentication_classes = [] permission_classes = [] serializer_class = PercentagesSerializer def get(self, request, format=None): lista = Check.objects.all() serializer = self.serializer_class(lista, many=True) return Response({'percentages': serializer.data})
验证修复效果
完成以上修改后重启项目,再次访问API就能看到包含两个百分比字段的正确数据了,控制台也不会再输出空的 {}。
内容的提问来源于stack exchange,提问作者Juan Camilo Orjuela
相关产品推荐
相关产品推荐

