如何知道一个周期是否与另一个周期重叠

2024-09-28 21:33:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我想申请一个允许我在指定时间内预订物品的申请。在

我需要一个函数来检查指定的项目是否已经在我想要使用它的期间被预订(所以预订应该失败)。你能帮助我吗?在

在模型.py在

from django.db import models
from datetime import *
from django.db.models import Q
import datetime
from django.core.exceptions import ValidationError
class Reservation(models.Model):
        date_debut = models.DateTimeField('debut de la reservation')
        date_fin = models.DateTimeField('fin de la reservation')
        obj_res = models.ForeignKey('Materiel')
        notice = models.CharField(max_length=200)
        personne = models.ForeignKey('Personne')
        def __int__(self):
                return self.id

        def save(self, *args, **kwargs):
            new_start_date = datetime.datetime(2013, 11, 16, 10, 00)
            new_end_date = datetime.datetime(2013, 11, 16, 11, 00)
            material = Materiel.objects.get(nom="Bimaire 1")

            clashing_reservations = Reservation.objects.filter(obj_res=material).filter(
                Q(date_debut__lte=new_start_date, date_fin__gte=new_start_date) |
                Q(date_debut__lt=new_end_date, date_fin__gte=new_end_date)
            )
            if clashing_reservations.exists():
                raise ValidationError('Those dates clash with another reservation.')    

            return super(Reservation, self).save(*args, **kwargs)   


class Materiel(models.Model):
        nom = models.CharField(max_length=200)
        description = models.CharField(max_length=200)
        responsable = models.CharField(max_length=200)
        modalites = models.CharField(max_length=200)

        def __unicode__(self):
                return self.nom


class Personne(models.Model):
        nom = models.CharField(max_length=200)
        prenom = models.CharField(max_length=200)

        def __unicode__(self):
                return self.nom

在视图.py在

^{pr2}$

编辑 谢谢,到目前为止它似乎是有效的。 但是现在我要定义new_start_date和new_end_date是表单的实际值。在


Tags: fromimportselfnewdatetimedatereturnmodels
2条回答

我不知道您的日期格式,但不管怎样,您可以使用模块日期时间将日期和时间相互比较(减法、加法、高/低等)。在

所以我举了一个简单的例子来说明它的用法(我假设你的格式是月/日/年):

from datetime import *
debut_date = datetime.strptime(date_debut_db, "%m/%d/%y")
fin_date = datetime.strptime(date_fin_db, "%m/%d/%y")

debut_date2 = datetime.strptime(date_debut_form, "%m/%d/%y")
fin_date2 = datetime.strptime(date_fin_form, "%m/%d/%y")

if (debut_date2 > debut_date and debut_date2 < fin_date) or (fin_date2 > debut_date and fin_date2 < fin_date): 
    print "Impossible!"
else:
    print "Possible!"

date_demance_dbdate_fin_db是您从数据库中取出的日期,而date_first_formdate_fin_form是用户填写的日期。在

这是未经测试的代码,但我认为这个逻辑应该测试是否有其他保留与表单中提交的保留重叠。这可能应该放在表单的clean方法中,或者其他一些验证中。甚至在Reservation模型的save方法上:

from django.db.models import Q

new_start_date = datetime.datetime(2013, 11, 16, 10, 00)
new_end_date = datetime.datetime(2013, 11, 16, 11, 00)
material = Materiel.objects.get(nom='Whatever')

clashing_reservations = Reservation.objects.filter(objet=material).filter(
    Q(date_debut__lte=new_start_date, date_fin__gte=new_start_date) |
    Q(date_debut__lt=new_end_date, date_fin_gte=new_end_date)
)
if clashing_reservations.exists():
    raise ValidationError('Those dates clash with another reservation.')

相关问题 更多 >