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

时间:2013-11-15 13:43:52

标签: python django

我想创建一个允许我在指定时间段内预订项目的应用程序。

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

models.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

views.py

def reservation(request):
    if request.POST:
        form = ReservationForm(request.POST, request.FILES)
        if form.is_valid():
                form.save()



    else:
        form = ReservationForm()

    args = {}
    args.update(csrf(request))

    args["form"] = form

    return render_to_response("reservation.html", args)

EDIT 到目前为止,它似乎工作。 但现在我想要定义new_start_date和new_end_date是表单的实际值。

2 个答案:

答案 0 :(得分:3)

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

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.')

答案 1 :(得分:2)

我不知道您的日期格式,但无论您是否可以使用模块日期时间来比较(减去,添加,上/下等)日期和时间。< / p>

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

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_debut_db date_fin_db 是您从数据库中获取的日期,而 date_debut_form date_fin_form 是用户填写。