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

Django中timedelta类型终端与Postman返回格式不一致如何解决

问题原因

你拿到的duration__sum是Python标准datetime.timedelta类型:

  • 终端执行print操作时,会自动调用timedelta的__str__方法,输出HH:MM:SS格式的可读字符串
  • Django自带的JSON序列化逻辑、DRF默认序列化器都会将timedelta类型转换为ISO 8601标准的持续时间格式,也就是你在Postman中看到的P0DT00H02M10S格式,这就是两处显示不一致的核心原因。

解决方案

方案1:手动转换格式(最灵活,无需修改全局配置)

直接在构造返回结果前,手动把timedelta转为你需要的格式即可:
如果需要返回总秒数:

x = VideoDetails.objects.filter(video__coursemodulevideos__module_id).aggregate(Sum('duration'))
total_dur = x['duration__sum']
# 处理空值情况,避免None报错
result = {"ho": {"duration__sum": total_dur.total_seconds() if total_dur else 0}}

如果需要返回和终端一致的HH:MM:SS格式:

def format_timedelta(td):
    if not td:
        return "0:00:00"
    total_sec = int(td.total_seconds())
    hours = total_sec // 3600
    minutes = (total_sec % 3600) // 60
    seconds = total_sec % 60
    return f"{hours}:{minutes:02d}:{seconds:02d}"

x = VideoDetails.objects.filter(video__coursemodulevideos__module_id).aggregate(Sum('duration'))
result = {"ho": {"duration__sum": format_timedelta(x['duration__sum'])}}

方案2:DRF自定义序列化字段(项目中多处需要处理timedelta时使用)

如果你使用Django REST Framework开发接口,可以自定义统一的timedelta序列化字段,全局复用:

from rest_framework import serializers
from datetime import timedelta

class CustomTimedeltaField(serializers.Field):
    def to_representation(self, value):
        if not isinstance(value, timedelta):
            return "0:00:00"
        total_sec = int(value.total_seconds())
        hours = total_sec // 3600
        minutes = (total_sec % 3600) // 60
        seconds = total_sec % 60
        return f"{hours}:{minutes:02d}:{seconds:02d}"

# 在你的序列化器中直接使用即可
class DurationSerializer(serializers.Serializer):
    duration__sum = CustomTimedeltaField()

方案3:自定义Django JSON编码器(使用原生JsonResponse时全局生效)

如果用Django自带的JsonResponse返回数据,可以自定义JSON编码器全局处理timedelta类型:

import json
from datetime import timedelta
from django.http import JsonResponse

class TimedeltaJSONEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, timedelta):
            total_sec = int(obj.total_seconds())
            hours = total_sec // 3600
            minutes = (total_sec % 3600) // 60
            seconds = total_sec % 60
            return f"{hours}:{minutes:02d}:{seconds:02d}"
        return super().default(obj)

# 返回响应时指定编码器即可
return JsonResponse(result, encoder=TimedeltaJSONEncoder)

内容的提问来源于stack exchange,提问作者user15361826

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:57:03