【问题标题】:How to calculate total duration: Durationfield()如何计算总持续时间:Durationfield()
【发布时间】:2021-08-27 12:39:52
【问题描述】:

我无法计算总持续时间。这里视频有持续时间,即 DurationField()。我对如何计算所有视频的总时长感到困惑。

Model

class VideoDetails(BaseModel, Timestamps, SoftDelete):
    video_name = models.CharField(max_length=254, null=False, blank=False)
    video_about_text = models.CharField(max_length=254, null=False, blank=False)
    duration = models.DurationField()
    video = models.OneToOneField(Video, on_delete=models.CASCADE)

class CourseModuleVideos(Timestamps, SoftDelete):
    module_id = models.ForeignKey(CourseModule, on_delete=models.CASCADE)
    video_id = models.ForeignKey(Video, on_delete=models.CASCADE)

class Video(BaseModel, Timestamps, SoftDelete):
    create_date = models.DateTimeField(auto_now_add=True, null=True)

view

z = CourseModuleVideos.objects.filter(module_id=o)
            for zo in z:
                print('o', zo.video_id)
                x = VideoDetails.objects.filter(video=zo.video_id).aggregate(sum('duration'))
                print(x.duration)

出现错误

"unsupported operand type(s) for +: 'int' and 'str'"

给我一​​个解决这个问题的方法。

【问题讨论】:

  • 你能分享CourseModuleVideos的模型吗?
  • 此外,请提供完整回溯。
  • class CourseModuleVideos(Timestamps): module_id = models.ForeignKey(CourseModule, on_delete=models.CASCADE) video_id = models.ForeignKey(Video, on_delete=models.CASCADE)
  • 请edit 提问。使用 CourseModuleVideos 和 Video 模型。
  • 您能解释一下从VideoDetails 到Video 或反之亦然的ForeignKey 的位置吗?

标签: python-3.x django-models


【解决方案1】:

您应该使用Sum expression [Django-doc],而不是sum builtin function [Python-doc]。因此,您可以使用Sum 实现此功能,并使用x['duration'] 访问字典中的值

from django.db.models import Sum

# ⋮

x = VideoDetails.objects.filter(video=zo.video_id).aggregate(
    Sum('duration')
)
print(x['duration'])

但这不是很有效,因为您将分别计算每个 VideoDetails 的持续时间,因此对于 N 个视频,进行 N 个查询。

我们可以计算整个模块的总和:

VideoDetails.objects.filter(
    video__coursemodulevideos__module_id=o
).aggregate(sum('duration'))['duration'] or timdelta()

【讨论】:

  • 非常感谢您提供这些信息和帮助
猜你喜欢
  • 1970-01-01
  • 2014-01-14
  • 2013-03-07
  • 1970-01-01
  • 2016-01-18
  • 2021-01-03
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
相关资源
最近更新 更多