首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django,多时间间隔重叠的查询筛选器

Django,多时间间隔重叠的查询筛选器
EN

Stack Overflow用户
提问于 2021-03-25 14:58:34
回答 1查看 173关注 0票数 0

我有一个工人和任务模型。

员工有工作时间(working_hours),任务有时间工作(working_time)。

这些时间域与TimeInterval模型关联为ManyToManyField。每个间隔都有一个开始和一个结束时间。

我使用ManyToManyField,因为员工和任务可以有多个工作时间间隔。

例如,员工可以在07:00至12:00和15:00至6:00的间隔内工作。任务必须在13:00到17:00之间完成。

我需要查询哪些任务适合工人在工作时间内使用。工作时间间隔必须重叠。我该怎么做呢?

我试着从一个特定的工作人员那里获得工作时间间隔,然后在循环中形成一个使用q对象进行过滤的条件。如下所示:

代码语言:javascript
复制
my_worker = Worker.objects.get(id=1)
my_worker_working_hours = my_worker.working_hours.all()
time_conditions = []

for interval in my_worker_working_hours:
    time_conditions.append(
        Q(
            Q(working_time__start__lte=interval.end) &
            Q(working_time__end__gte=interval.start)
        )
    )

suitable_task = Task.objects.filter(*time_conditions)

如果任务只有一个working_time间隔,则此操作有效。否则,筛选器无法正常工作。

我的模特:

代码语言:javascript
复制
class Worker(models.Model):
    name = models.CharField(max_length=10)
    working_hours = models.ManyToManyField(TimeInterval)

class Task(models.Model):
    name = models.CharField(max_length=10)
    is_assigned = models.BooleanField(default=False)
    working_time = models.ManyToManyField(TimeInterval)

class TimeInterval(models.Model):
    start = models.TimeField()
    end = models.TimeField()

更新

我在用SQLite。我发现在Django中有PostgreSQL特定的DateTimeRangeField。这能解决我的问题吗?我对PostgreSQL不是很熟悉。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-25 15:16:03

你用的是或带有q对象的操作符(管道)

代码语言:javascript
复制
suitable_tasks = Task.objects.none()
for interval in my_worker_working_hours:
    suitable_tasks |= Task.objects.filter(
        Q(working_time__start__lte=interval.end) & 
        Q(working_time__end__gte=interval.start))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66802146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档