Python Django:有没有什么方法可以让;“日期范围”的唯一性;?

Python Django:有没有什么方法可以让;“日期范围”的唯一性;?,python,django,django-models,django-templates,Python,Django,Django Models,Django Templates,如果我的物品型号为: class Item(models.Model): name = models.CharField(max_length=500) startDate = models.DateField("Start Date", unique="true") endDate = models.DateField("End Date") 每个项目都需要有一个唯一的日期范围。例如,如果我创建了一个日期范围为6月1日至6月8日的项目,我如何才能阻止创建日

如果我的物品型号为:

class Item(models.Model):
    name = models.CharField(max_length=500)
    startDate = models.DateField("Start Date", unique="true")
    endDate = models.DateField("End Date")      
每个项目都需要有一个唯一的日期范围。例如,如果我创建了一个日期范围为6月1日至6月8日的项目,我如何才能阻止创建日期范围为6月3日至6月5日的项目(或使用模板逻辑呈现错误)


如果我能更好地澄清这个问题,请告诉我

您不能在模型级别强制执行此操作,但是可以将save方法重写为 大概是这样的:

class Item(models.Model):
    name = models.CharField(max_length=500)
    startDate = models.DateField("Start Date", unique="true")
    endDate = models.DateField("End Date")     

    def save(self, *args, **kwargs):
        try:
            Item.objects.get(Q(startDate__range=(self.startDate,self.endDate))|Q(endDate__range=(self.sartDate,self.endDate))|Q(startDate__lt=self.startDate,endDate__gt=self.endDate))
            #raise some save error
        except Item.DoesNotExist:
            super(Item,self).save(*args,**kwargs)

编辑:也许日期范围检查可以变得更容易,因为我已经做了很久了,但它显示了一般的概念:)。

如果您使用postgresql作为数据库后端,并使用django>=3的版本,您可能希望在数据库级别强制执行此逻辑(当给出接受的答案时,此方法不可用)

来自django.contrib.postgres.constraints导入排除约束
从django.contrib.postgres.fields导入DateRangeField,RangeOperators
从django.db导入模型
类别项(models.Model):
name=models.CharField(最大长度=500)
日期\范围=日期范围字段()
类元:
约束=[
排除约束(
name='exclude_overlap',
表情=[
('date_range',RangeOperators.OVERLAPS),
],
)
资料来源:

+1用于在业务逻辑层强制执行此操作,感谢您的快速回答!我必须在早上的第一件事上回到这一点。我得到了这个工作…但我不知道在我提出验证错误后该怎么做。在用户尝试保存后,我能让错误显示在管理中吗?我认为最好的方法是抛出一个
django.db.IntegrityError的实例,无ValidationError,管理员将知道如何处理该错误。另一个选项是将其移动到clean方法而不是save方法,并抛出验证错误(管理员应再次处理)。注意,但是模型清理方法仅在上的django 1.2中受支持。@KillianDS我无意中点击了它,对不起。