在两个日期之间过滤但具有相反的逻辑
Filtering between two dates but with reverse logic
我正在进行搜索,如果“音乐家”在两个日期(start_date、end_date)之间有空,应该能够进行过滤。一位音乐家有一个日历,其中包含他演出的日期。
因此,当用户输入他想要预订音乐家的两个所需日期时,我应该查看该音乐家是否至少在这两个日期之间的日期之一没有演出。我正在使用 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
我正在进行搜索,如果“音乐家”在两个日期(start_date、end_date)之间有空,应该能够进行过滤。一位音乐家有一个日历,其中包含他演出的日期。 因此,当用户输入他想要预订音乐家的两个所需日期时,我应该查看该音乐家是否至少在这两个日期之间的日期之一没有演出。我正在使用 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