【问题标题】:Adding a field to queryset in django在 django 中向查询集添加字段
【发布时间】:2020-05-13 02:05:24
【问题描述】:

我有一个模型,其字段是 datetimefields start_time 和 end_time 我想在 API 上显示 start_time、end_time 以及它们之间的区别 但是,我不想使用 for 或 while 循环来实现这一点,因为它太慢了 如何在不循环的情况下获得 API 的差异

【问题讨论】:

  • 我不明白为什么循环太慢了。 Django 也会循环,因为它从数据库中检索数据,并且会循环以“打包”模型对象中的数据。
  • 你有没有尝试过这样的事情,ModelKlass.objects.annotate(diff=F('field_1')-F('field_2'))
  • @ArakkalAbu:问题在于 Django 的“类型系统”并没有将其作为DurationField

标签: django django-rest-framework django-queryset


【解决方案1】:

您可以用差异注释查询集,然后使用ExpressionWrapper将其转换为DurationField,从而获得timedelta对象:

from django.db.models import DurationField, ExpressionWrapper, F

MyModel.objects.annotate(
    time_diff=ExpressionWrapper(
        F('end_time')-F('start_time'),
        output_field=DurationField()
    )
)

this 查询集产生的MyModels 将因此有一个额外的属性time_diff,它是一个包含end_timestart_time 之间差异的timedelta 字段。

【讨论】:

    猜你喜欢
    • 2018-05-25
    • 2018-03-10
    • 1970-01-01
    • 2012-08-20
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 2022-11-12
    相关资源
    最近更新 更多