Django模型对象过滤关于日期范围以查找创建对象的初始日期?

Posted

技术标签:

【中文标题】Django模型对象过滤关于日期范围以查找创建对象的初始日期?【英文标题】:Django model object filtering with respect to date range for finding initial date for creating object? 【发布时间】:2012-05-14 02:05:23 【问题描述】:

我有一个简单的事件模型,它有 start_date 和 end_date,关键部分是 日期范围必须是唯一的。

出于这个原因,我编写了查询(Q)过滤器来检查日期范围是否唯一。 无论如何,我的问题在于视图部分;当用户来到带有初始日期的事件添加页面时,我需要创建一个事件对象,(用户可以稍后根据日期范围的唯一性进行更改)

我如何决定(过滤)哪些天不包含在任何 Event 对象中? 或者如果这个月有任何可用的日期?使用 django 过滤器或一些聪明的方法...

#model:
class Event(models.Model):

    user = models.ForeignKey(User)
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()
    status = models.IntegerField(default=0)

    def save(self, *args, **kwargs):
        try:
            Event.objects.get(
                Q(user=self.user, status=1),
                Q(start_date__range=(self.start_date, self.end_date))
                |Q(end_date__range=(self.start_date, self.end_date))
                |Q(start_date__lte=self.start_date, end_date__gte=self.end_date)
            )
            raise IntegrityError("Error message")
        except Event.DoesNotExist:
            super(Event,self).save(*args,**kwargs)

在我看来:有一个函数用于创建一个带有初始日期的事件对象并重定向到 url,用于更新/编辑事件详细信息。

#view:
try:
    event = Event.objects.create(user=request.user,
                                 start_date=datetime.date.today(), 
                                 end_date=datetime.date.today())
except IntegrityError, e:
    return HttpResponse(e)

ps:如果有更聪明的方法和一些不同的设计方法,我会很高兴听到。

【问题讨论】:

那么,你想找到最接近今天的开始/结束,可以通过你的保存方法中的查询吗? 是的,这就是我想要的。 【参考方案1】:

不是您问题的核心,但请注意,您没有在此处涵盖MultipleObjectsReturned 案例:

    try:
        Event.objects.get(
            Q(user=self.user, status=1),
            Q(start_date__range=(self.start_date, self.end_date))
            |Q(end_date__range(self.start_date, self.end_date))
            |Q(start_date__lte=self.start_date, end_date__gte=self.end_date)
        )
        raise IntegrityError("Error message")
    except Event.DoesNotExist:
        super(Event,self).save(*args,**kwargs)

我觉得会更好

    if Event.objects.filter(
        Q(user=self.user, status=1),
        Q(start_date__range=(self.start_date, self.end_date))
        | Q(end_date__range(self.start_date, self.end_date))
        | Q(start_date__lte=self.start_date, end_date__gte=self.end_date)
    ):
        raise IntegrityError("Error message")
    else:
        super(Event,self).save(*args,**kwargs)

【讨论】:

是的,我注意到今天早上在这里检查时感谢您的解决方案正在等待我。

以上是关于Django模型对象过滤关于日期范围以查找创建对象的初始日期?的主要内容,如果未能解决你的问题,请参考以下文章

TypeError: Django中日期范围的预期字符串或类似字节的对象错误。

在 Django 中,如何优雅地将查询集过滤器添加到大型组或对象的所有成员?

如何在 django 中按日期范围过滤记录?

核心数据 - 查找具有重叠日期范围的记录

Django模型表单对象的自动创建日期?

在Django Q对象中查找最新日期