首页 > 解决方案 > 在两个日期之间过滤,但使用相反的逻辑

问题描述

如果“音乐家”在两个日期(开始日期,结束日期)之间有空,我正在搜索应该能够过滤。音乐家有一个日历,其中包含他的演出日期。因此,当用户输入他想要预订音乐家的两个所需日期时,我应该查看音乐家是否在两者之间的至少一个日期没有演出。我正在使用 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()

我希望我正确地提出了这个问题,如果需要更多信息,我会提供。

标签: pythondjangodatesearchfilter

解决方案


尝试这个:

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

推荐阅读