Sql Django模型——过滤字段元组是否在元组列表中

Sql Django模型——过滤字段元组是否在元组列表中,sql,regex,django,django-models,Sql,Regex,Django,Django Models,编辑:请参阅下面的代码以减少阅读量 我试图简化这个例子,但它仍然有点复杂。我怀疑我可能必须重写我的模型以更好地支持此搜索。 假设我有一个包含相关天数和开始/结束时间的课程模型。我还有一份目前增加的课程列表。我希望返回所有与我当前添加的课程不冲突的课程 天数存储为字符字段:“MoTuWeThFr”表示一周中每天发生的一个类。开始时间和结束时间都只是一个django日期时间字段 我能够得到一个日期元组列表和可能发生冲突的相关时间。例如,我可以得到列表[('Mo',08:00,10:00),('We'

编辑:请参阅下面的代码以减少阅读量

我试图简化这个例子,但它仍然有点复杂。我怀疑我可能必须重写我的模型以更好地支持此搜索。 假设我有一个包含相关天数和开始/结束时间的课程模型。我还有一份目前增加的课程列表。我希望返回所有与我当前添加的课程不冲突的课程

天数存储为字符字段:“MoTuWeThFr”表示一周中每天发生的一个类。开始时间和结束时间都只是一个django日期时间字段

我能够得到一个日期元组列表和可能发生冲突的相关时间。例如,我可以得到列表[('Mo',08:00,10:00),('We',08:00,10:00),('Th',12:00,13:00)]。我需要返回所有课程,如果其“天”字段包含“Mo”,则其开始/结束时间不与(08:00,10:00)重叠,如果其包含“Th”,则其开始/结束时间不与(12:00,13:00)重叠,等等

我认为使用正则表达式可以在几天或几次内实现过滤。例如,如果“无效”天数为['Mo'、'We'、'Th'],只需编写一个正则表达式,该表达式与包含这些天数的任何字符串相匹配,然后排除任何带有与正则表达式相匹配的'days'的课程。但我不确定如何在过滤时“链接”时间和日期。也许如果我在模型中为日期和时间创建一个新字段,比如day_time=“MoWeFr 08:00-10:00”。然后可以通过编程方式为排除列表中的每个元组创建一个带有一个子句的正则表达式。但这会有效率吗?如有任何建议,将不胜感激。我知道这个问题可能过于具体,无法广泛使用,但它似乎是一个合理的用例,我很惊讶由此产生的数据库查找如此棘手

我在下面提供了一个更具体的伪代码示例: 在models.py中:

class Course(models.Model):
    start_time = models.TimeField()
    end_time = models.TimeField()
    days = models.CharField()
示例课程:

start_time = 08:00
end_time = 10:00
days = 'MoWeFr'
在views.py中:

current_courses = [('Mo', 08:00, 10:00), ('We', 08:00, 10:00), ('Th', 12:00, 13:00)]

# returns all courses that don't conflict with times in current_courses
non_conflict_courses = Course.objects.exclude(...)
仅按天筛选的示例(对于['Mo'、'We'、'Th']):


如何同时筛选/排除日期和时间?我不确定如何“链接”它们。

已经写了这篇文章。。。。。这很难。你有没有可能把这个写进密码里。大量的写作。我会把这些日子放在他们自己的布尔列中。如果你想加快速度,字段
days
包含非规范化值。我个人一点也不喜欢那种设计。能否切换到PostgreSQL作为后端数据库?如果是,我建议您在
天内使用
阵列字段
。然后,您的示例将存储为
['Mo','We','Fr']
。但是,如果课程在不同的日子有不同的开始和/或结束时间,该怎么办?如果你有这个要求,你甚至可以选择一个
JSONField
。抛弃正则表达式。这使得你的代码很难维护,性能也可能是个问题。谢谢@cezar和Bensiali的建议。我同意regex很难维护,因此我将切换到每天使用一个布尔字段。不幸的是,我不能轻易地切换到PostgreSQL,但这可能是以后的一种可能性。幸运的是,课程每天都有相同的时间,因此如果/当我切换时,ArrayField应该足够了。再次感谢你的建议。
Course.objects.exclude(days__iregex=r'(\w\w)*(Mo)(\w\w)*|(\w\w)*(We)(\w\w)*|(\w\w)*(Th)(\w\w)*')