django - 在 Django 中查找特定范围内的重叠日期

标签 django python-3.x

我在 Django 中查找重叠日期范围时遇到问题。我有两个模型,reunion,它有一个日期范围:

class reunion(models.Model):        
    resource = models.ForeignKey(resource, on_delete=models.CASCADE)
    start = models.DateTimeField()
    end = models.DateTimeField()
    title = models.CharField(max_length=100)

还有resource模型:

class resource (models.Model):
    site = models.ForeignKey(site, on_delete=models.CASCADE)
    name = models.CharField(max_length=60)    
    def isAvaible(self, endDate, initialDate):
        try:
            self.reunion_set.get(Q(start__lt=endDate) | Q(end__gt=initialDate))  
            return False
        except:
            return True

当我需要在特定的日期范围内重新团聚时,我需要找到一个不重叠的资源,所以我使用这种方法:

def getAvaibleAccount(initialDate, endDate):
    avaibleResources = resource.objects.all()

    for avaibleResource in avaibleResources:
        if avaibleResource.isAvaible(initialDate,endDate):
            return avaibleResource           
    return None

但我的代码显示日期范围:(12/30/2019 11:00 - 12/30/2019 12:00) 与 (12/31/2019 11:30 - 12/31/2019 12: 30) 好像只是比较时间而不是日期。我一直在寻找,但我没有任何运气。

我的错误在哪里?

我将日期作为字符串获取并使用 dateutil.parser.parse() 解析它们。

最佳答案

两个区间(s1, t1)(s2, t< sub>2)not 整体,给定 t1 < s2 ,或 t2 < s1。因此,这意味着两个资源重叠给定 t1 ≥ s2t2 ≥ s<子>1.

因此,这意味着您应该执行如下检查:

def isAvaible(self, endDate, initialDate):
    return <b>not</b> self.reunion_set.filter(<b>end__gte=intialDate, start__lte=endDate</b>).exists()

请注意,您应该不要使用 .get(..) [Django-doc]在这里,因为当有 no 记录或有 多个 记录(两个或更多)时,这将引发错误。您在这里可以使用.exists() [Django-doc]找出是否存在这样的记录。

关于django - 在 Django 中查找特定范围内的重叠日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59533698/

相关文章:

c - C 中的 Python 扩展 - 来回传递列表

python - 无法在 Gtk.TextView i Python 3 中对列进行排序

python - if 条件后的语法无效

python - 如何从 Django 中的查询集中删除前 N 项

使用ctypes将python字符串对象转换为c char *

python - 在 Django 和 Apache 中使用 WSGI 时如何修复 "Timeout when reading response headers from daemon process"错误

django - 从 django 传递环境变量以响应应用程序

python - 分割一个字符恰好重复两次的序列

python - Django - 如何为 values_list 中的每个元组添加一个值

django - 针对模型实例测试 Q 对象