Aren
Aren

Reputation: 23

Django model object filtering with respect to date range for finding initial date for creating object?

I have a model for an event simply which has start_date and end_date and the critical part is date range must be unique.

For that reason, I wrote query like(Q) filters which checks date range is unique or not. Anyway, my problem is at in view part; I need to create an Event object when user comes to event adding page with initial dates,(User can change it later with respect to date range uniqueness)

How can I decide(filter) to which days not include in any Event object ? or If there any available date in this month ? with django filters or some smart approach...

#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)

In my view: there is one function which is for creating an Event object with initial dates and redirect to url, for updating/editing event details.

#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: if there is more smarter way of doing this with some different design approach , I would be happy to hear.

Upvotes: 2

Views: 2077

Answers (1)

Skylar Saveland
Skylar Saveland

Reputation: 11454

Not to the heart of your question, but note that you don't cover the MultipleObjectsReturned case here:

    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)

I think it would be better

    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)

Upvotes: 2

Related Questions