我有一个事件的模型,其中包含start_date和end_date,关键部分是日期范围必须是唯一的。
出于这个原因,我编写了类似(Q)过滤器的查询,它检查日期范围是否唯一。 无论如何,我的问题是在视野中;当用户来到具有初始日期的事件添加页面时,我需要创建一个Event对象(用户可以稍后根据日期范围唯一性进行更改)
如何判断(过滤)哪些日期不包含在任何Event对象中? 或者如果这个月有可用的日期?用django过滤器或一些聪明的方法......
#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)
在我看来:有一个函数用于创建一个具有初始日期的事件对象并重定向到url,用于更新/编辑事件详细信息。
#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:如果采用不同的设计方法有更聪明的方法,我会很高兴听到。
答案 0 :(得分:2)
不是问题的核心,但请注意,此处未涵盖MultipleObjectsReturned
案例:
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)
我认为会更好
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)