【问题标题】:Django: Is there any way to have "unique for date range"?Django:有没有办法让“日期范围独一无二”?
【发布时间】: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 我不小心点击了,抱歉。

标签: python django django-models django-templates


【解决方案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/

【讨论】:

    猜你喜欢
    • 2011-10-09
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 2013-08-31
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多