Django:有没有办法让“日期范围独一无二”?

时间:2010-06-02 20:50:00

标签: 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日的,我该如何保留日期范围为6月3日到6月5日的从创建(或使用模板逻辑渲染错误)?

让我知道我是否可以更好地澄清这个问题!

2 个答案:

答案 0 :(得分:7)

您无法在模型级别强制执行此操作,但您可以将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)

编辑:也许日期范围检查可以更容易,很长一段时间以来我做了,但它显示了一般概念:)。

答案 1 :(得分:0)

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

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/