查找时间范围以限制日历中同一时间发生的事件。 (django)

Posted

技术标签:

【中文标题】查找时间范围以限制日历中同一时间发生的事件。 (django)【英文标题】:Finding the Time Range to restrict the events occuring on same time in calendar. (django) 【发布时间】:2021-03-12 16:31:21 【问题描述】:

我想限制重叠在同一日期和同一时间发生的事件。当用户在同一日期和同一时间注册事件时,我想向用户显示重叠错误。我无法查询 start_timeend_time 之间的时间范围。限制重叠的最佳方法是什么?

models.py

class Event(models.Model):
user         = models.ForeignKey(User, on_delete=models.CASCADE)
title         = models.CharField(max_length=200)
description   = models.TextField()
date          = models.DateField()
start_time    = models.TimeField()
end_time      = models.TimeField()
created_date  = models.DateTimeField(auto_now_add=True)
group        = models.ForeignKey(Group , on_delete= models.CASCADE , null= True , blank=True)
priority        = models.ForeignKey('Priority' , on_delete= models.CASCADE , null= True , blank=True)

@property
def get_html_url(self):
    url = reverse('event-detail', args=(self.id,))
    return f' <a href="url"> self.title </a>'

def create_event(slef):
    return f"http://localhost:800/event/create/"

# def get_event_in_current_date(self):
#     print(Event.objects.filter(date= self.date))
#     return Event.objects.filter(date= self.date)

@property
def get_all_events(self):
    if Event.objects.filter(date= self.date).count() >1:
        url = reverse('event-all', args=(self.date, ))
        return f' <a href="url"> ... </a>'
    return ""

@property
def get_all_events_by_group(self):
    print(self.group)
    if Event.objects.filter(date= self.date , group= self.group ).count() >1:
        url = reverse('event-all-group', args=(self.date, self.group.name ))
        return f' <a href="url"> ... </a>'
    return ""



def __str__(self):
    # print(self.date)
    return str(self.date)

views.py

class CreateEvent(LoginRequiredMixin , View):
def post(self , request , *args , **kwargs):
    start_time         = request.POST.get('start_time')
    end_time           = request.POST.get('end_time')
    title              = request.POST.get('title')
    description        = request.POST.get('description')
    date               = request.POST.get('date')
    priority          = request.POST.get('priority')
    GROUP_REQUEST_SLUG = str(request.META.get('HTTP_REFERER'))
    group_slug         = GROUP_REQUEST_SLUG.split('/')[-2]
    group = Group.objects.filter(slug = group_slug).first()
    priority = Priority.objects.create(scale =priority )
    
    
    if group is None:
        Event.objects.create(date= date , title = title , start_time= start_time , end_time=end_time ,description= description , user= request.user , priority = priority)
        messages.success(request, "Event has been createds .")
        
    else:
        Event.objects.create(date= date , title = title , start_time= start_time , end_time=end_time ,description= description , user= request.user , group= group , priority = priority)
        messages.success(request, f"Event has been created  in group")
        return redirect('switch-group' ,group_slug )
    return redirect('calendar')

【问题讨论】:

【参考方案1】:

Django 提供了一个range lookup

Event.objects.filter(date__range=["2011-01-01", "2011-01-31"])

Event.objects.filter(pub_date__time__range=(datetime.time(8), datetime.time(17)))

或者你也可以使用gtgteltltelookups

我认为您必须将unique_together 用于您的Event 模型(more info)。

unique_together = ['date', 'start_time']

【讨论】:

感谢您的回复。那在我的情况下不起作用,你能详细说明一下吗?那太好了。 什么不起作用?你能具体说明你的问题吗? 我在 Models.py 中使用 unique_together 作为 Meta 类,但仍然无法正常工作。 虽然这并没有给出任何错误!我真的很想获得时间(用户输入)并想将它与我的数据库中存在的时间进行比较。所以没有任何事件可以与时间重叠。

以上是关于查找时间范围以限制日历中同一时间发生的事件。 (django)的主要内容,如果未能解决你的问题,请参考以下文章

CalDAV 请求 gGt iCloud 日历事件

完整日历,如何隐藏时间列并按顺序列出事件

在 pandas 中查找每月某个时间范围内发生的定期付款

日历重复/重复事件 - 最佳存储方法

使用 Laravel 在 FullCalendar 中重复发生的事件

通过将日期与日历日期进行比较来加载即将发生的事件