Reputation: 23
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
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