如果我的商品模型是:
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日的项从创建(或使用模板逻辑渲染错误)?
请让我知道我是否可以更好地澄清这个问题!
答案 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/