2

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.

2
  • so, you want to find start/end closest to today that can get past the query in your save method? Commented May 14, 2012 at 2:39
  • yes, simply that is what I want. Commented May 14, 2012 at 14:54

1 Answer 1

2

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)
Sign up to request clarification or add additional context in comments.

1 Comment

Yes, I noticed that this morning and when checked here thanks to you solution is waiting for me.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.