Django:有没有办法让“日期范围独一无二”?
Posted
技术标签:
【中文标题】Django:有没有办法让“日期范围独一无二”?【英文标题】:Django: Is there any way to have "unique for date range"? 【发布时间】:2011-02-27 00:53:22 【问题描述】:如果我的项目模型是:
class Item(models.Model):
name = models.CharField(max_length=500)
startDate = models.DateField("Start Date", unique="true")
endDate = models.DateField("End Date")
每个 Item 都需要有一个唯一的日期范围。例如,如果我创建一个日期范围为 6 月 1 日至 6 月 8 日的 Item,我该如何保留日期范围为 6 月 3 日至 6 月 5 日的 Item从被创建(或使用模板逻辑呈现错误)?
请让我知道我是否可以更好地澄清这个问题!
【问题讨论】:
@KillianDS 我不小心点击了,抱歉。 【参考方案1】:您不能在模型级别强制执行此操作,但是您可以覆盖保存方法以 像这样:
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)
编辑:也许日期范围检查可以更容易,因为我做了很长时间,但它显示了一般概念:)。
【讨论】:
+1 用于在它所属的业务逻辑层中执行此操作 感谢您的快速解答!我必须在早上回到这第一件事。 我得到了这个工作......但我不知道在我提出验证错误后该怎么做。用户尝试保存后,我可以让错误出现在管理员中吗? 我认为最好的方法是抛出django.db.IntegrityError
的实例,没有ValidationError,管理员会知道如何处理。另一种选择是将其移至 clean 方法而不是 save 方法并抛出验证错误(管理员应该再次处理)。但是请注意,仅从 django 1.2 开始支持模型清理方法。【参考方案2】:
如果您使用 postgresql 作为数据库后端并使用 django >=3 版本,您可能希望在数据库级别强制执行此逻辑(当给出接受的答案时,此方法不可用)。
from django.contrib.postgres.constraints import ExclusionConstraint
from django.contrib.postgres.fields import DateRangeField, RangeOperators
from django.db import models
class Item(models.Model):
name = models.CharField(max_length=500)
date_range = DateRangeField()
class Meta:
constraints = [
ExclusionConstraint(
name='exclude_overlap',
expressions=[
('date_range', RangeOperators.OVERLAPS),
],
)
来源: https://docs.djangoproject.com/en/3.2/ref/contrib/postgres/constraints/
【讨论】:
以上是关于Django:有没有办法让“日期范围独一无二”?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法让石墨烯与 django GenericRelation 字段一起工作?