【问题标题】:how to filter between two existing date django如何在两个现有日期 django 之间进行过滤
【发布时间】:2021-06-28 09:39:25
【问题描述】:

我正在尝试过滤并检查两个日期是否已经存在,例如我们有这个现有的两个日期28-6-2021 11:30 PM30-6-2021 11:30 PM,我必须阻止用户选择包含在这两个现有日期之间的任何日期例如,如果用户尝试选择 29-6-2021 12:00 PM1-7-2021 12:00 PM ,它应该会引发错误 the dates already taken ! 这是我的models.py

class Booking(models.Model):
    room_no = models.ForeignKey(Room,on_delete=models.CASCADE,blank=True,related_name='rooms')
    check_in = models.DateTimeField(default=datetime.now)
    check_out = models.DateTimeField()   

#my form

class BookingForm(forms.ModelForm):
    check_in = forms.DateTimeField(required=True,input_formats=['%Y-%m-%dT%H:%M','%Y-%m-%dT%H:M%Z'],widget=forms.DateTimeInput(attrs={'type':'datetime-local'}))
    check_out = forms.DateTimeField(required=True,input_formats=['%Y-%m-%dT%H:%M','%Y-%m-%dT%H:M%Z'],widget=forms.DateTimeInput(attrs={'type':'datetime-local'}))
    class Meta:
        model = Booking
        fields = ['check_in','check_out']

这是我的 views.py ,我已经尝试过实现它

@login_required
def add_booking(request,room_no):
   room_number = get_object_or_404(Room,room_no=room_no)
   if request.method == 'POST':
        form = BookingForm(request.POST)
        if form.is_valid():
            obj = form.save(commit=False)
            if room_number.rooms.filter(check_in__gte=check_in,check_out__gte=check_out).exists():
            #if room_number.rooms.filter(Q(check_in__gte=check_in, )|Q(check_out__lte=check_out)).exists(): #but still doesnt work
                return HttpResponse('taken! sorry , try another room please')
            obj.room_no = room_number
            obj.save()  
            messages.success(request,f'room number {room_number} added')
   form = BookingForm()

   return render(request,'booking/add_booking.html',{'form':form,'room_number':room_number})

但不起作用,该项目是针对酒店和预订应用程序的,我必须防止用户选择错误的日期!请问有可能吗? 非常感谢..

【问题讨论】:

  • 您的check_incheck_out 日期是多少?或日期时间?你从用户那里得到什么?如果您收到 date obj 将其转换为 datetime 然后使用您的 datetime 字段进行过滤。发生这种情况是因为您将 datedatetime 进行比较
  • 它们是日期时间

标签: python mysql django


【解决方案1】:

您应该对每个日期进行两次单独检查,我认为您搞砸了 gtelte 参数。

例如gte 检查您的数据库中的值是否大于或等于您传递给过滤器的值。

你可以通过做得到你想要的:

check_in_filter = Q(check_in__lte=check_in) & Q(check_out__gte=check_in)
check_out_filter = Q(check_in__lte=check_out) & Q(check_out_gte=check_out)
room_number.rooms.filter(check_in_filter | check_out_filter).exists()

如果选择的任何日期适合现有日期范围,则最后一个表达式现在返回 True。

【讨论】:

    【解决方案2】:

    似乎最终需要的是,如果 check_incheck_out 日期在现有日期内,则不应允许预订。

    check_in_within_dates = Q(check_in__lte=check_in) & Q(check_out__gte=check_in)
    check_out_within_dates = Q(check_in__lte=check_out) & Q(check_out__gte=check_out)
    
    room_numbers.rooms.filter(
        check_in_within_dates | check_out_within_dates
    )
    

    因此,在示例场景中,它将匹配第一个条件 check_in_within_dates 并且不允许预订。

    【讨论】:

    • 谢谢,但它仍然接受错误的日期和时间
    • 您能否添加一些示例,说明这种方法究竟是哪些日期等失败了?
    • ` check_in = forms.DateTimeField(required=True,input_formats=['%Y-%m-%dT%H:%M','%Y-%m-%dT%H: M%Z'],widget=forms.DateTimeInput(attrs={'type':'datetime-local'}))` 我的输入输出格式
    • 我输入了3-7-2021 13:07 PM to 6-7-2021 13:07PM 之后我尝试输入3-7-2021 12:00 PM to 4-7-2021 12:00 PM 它接受了
    • 这个答案与您在原始问题中所犯的错误相同,混淆了gtelte 查找。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多