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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:12:29