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 字段一起工作?

有没有办法检查字符串是不是是 django 查询集的有效过滤器?

小米范工具系列之八:小米范越权漏洞检测工具

有没有办法让 EC2 实例中的请求保持超过 60 秒?

django 自定义标签内联或块

没有密码的django身份验证