【问题标题】:Django orm remove overlapping date_rangesDjango orm 删除重叠的 date_ranges
【发布时间】:2021-01-15 00:43:30
【问题描述】:

我是 django 新手,我有一张表格,里面有多个不同日期范围的条目。我只想获取唯一的范围,然后从中获取天数。例如

考虑以下三个范围:

1. 10-09-2017 to 10-09-2019
2. 10-08-2018 to 10-02-2020
2. 04-04-2020 to 04-04-2020

在上面的示例 1 和 2 中有重叠的日期,点 2 的实际计算应该将点 1 的 start_range 更改为点 1 的 end_range,然后根据此计算天数(我知道这可能有点令人困惑,我如果需要,我很乐意进一步解释)我可以使用类似以下的方法来获取每个 date_range 的天数差异

calculate_experience = ExpressionWrapper(
        Case(
            When(experiences__end__isnull=True, then=date.today()-F('start'))[0].days, default=F('end')-F('start')),
            distinct=True, filter=Q(is_active=True), output_field=DurationField()
    )

但我不知道如何从中获得唯一的范围,唯一想到的是将这些放在一个列表中,然后迭代该手动设置范围,然后计算差异。有一个更好的方法吗?非常感谢任何帮助或方向感。谢谢!

【问题讨论】:

    标签: python django django-models django-rest-framework django-orm


    【解决方案1】:

    在这个例子中,我执行了两个从数据库中获取用户的查询。然后我使用set 来查找两组中的用户。

    如果我理解正确,这应该回答范围 1 和范围 2 之间重叠天数的问题。

    some_users = User.objects.filter(id__gt=3)
    >>> some_users <QuerySet [<User: cake>, <User: pie>]>
    
    all_users = User.objects.all()
    >>> <QuerySet [<User: admin>, <User: apple>, <User: banana>, <User: cake>, <User: pie>]>
    
    # Casting to set is optional. 
    some_users_set = set(some_users)
    all_users_set = set(all_users)
    
    # users in both sets
    some_users_set & all_users_set
    >>> {<User: cake>, <User: pie>}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 2019-07-24
      • 2020-02-13
      • 2010-11-04
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多