python - 在两个日期之间过滤,但使用相反的逻辑
问题描述
如果“音乐家”在两个日期(开始日期,结束日期)之间有空,我正在搜索应该能够过滤。音乐家有一个日历,其中包含他的演出日期。因此,当用户输入他想要预订音乐家的两个所需日期时,我应该查看音乐家是否在两者之间的至少一个日期没有演出。我正在使用 djagno 过滤器并使用 .filter() 和 .exclude() 我能够过滤,但它排除了在该范围内只有一场演出的音乐家,所以显然这是错误的。我有这段代码:
def _filter_start_date_end_date(self, queryset):
queryset = queryset.exclude(shows__performance_date__range=[self.filter_parameters['start_date'],
self.filter_parameters['end_date']])
return queryset
查询集包含数据库中的所有音乐家。显示型号:
class Show(models.Model):
id = models.AutoField(primary_key=True)
musician = models.ForeignKey(Musician, on_delete=models.CASCADE, related_name='shows')
additional_musicians = models.CharField(max_length=200, blank=True, null=True)
genres = models.ManyToManyField('Genres', blank=True)
performance_date = models.DateField()
performance_start = models.TimeField()
performance_end = models.TimeField()
我希望我正确地提出了这个问题,如果需要更多信息,我会提供。
解决方案
尝试这个:
import datetime
def daterange(d1, d2):
return (d1 + datetime.timedelta(days=i) for i in range((d2 - d1).days + 1))
start_date = self.filter_parameters['start_date']
end_date = self.filter_parameters['end_date']
free_slots = []
for each_date in daterange(start_date, end_date):
shows = queryset.filter(
shows__performance_date=each_date)
if not shows:
free_slots.append(each_date)
return free_slots # List of available dates
推荐阅读
- javascript - 移动设备检测
- asp.net-web-api - 如何使用 Swashbuckle Swagger 注释错误
- java-8 - 如何使用 Java 8 ASM 修复此方法重命名问题
- javascript - 将 id 与点击元素 id 或动态内容的最整洁的父 id 匹配
- javascript - 有人可以为 var 长度提供 JS 函数吗
- vue.js - Vue 项目“npm run dev”导致“无法访问此站点错误”
- javascript - 希望让 Google 表格识别多行新数据并以 XML 格式发送到 API
- python - 如何将 1d 数组重塑为 2d 数组大小不同的 3d 数组?
- sql - 在 IIF(IsError()) 的错误条件下访问更新字段为 NULL 值
- c - 在将 csv 文件读取到 C 中的结构数组时从空行中删除垃圾输出