Django unique_together约束用于日期验证

sycxhyv7  于 2023-07-01  发布在  Go
关注(0)|答案(2)|浏览(136)

我有以下模型:

class Completion(models.Model):
    date_completed = models.DateTimeField(auto_now=False, auto_now_add=False)
    related_task = models.ForeignKey(Task, on_delete=models.CASCADE)

我需要检查每个Completion有唯一的日期(不是日期时间-只有日期)为每个任务(这是Completion的相关字段)。换句话说,我需要这样的东西:

class Meta:
    unique_together = [
        'date_completed__date',
        'related_task'
    ]

我知道它不这样工作(也不应该),所以我想问,我如何才能达到预期的结果(如果完全可能的话)。

w80xi6nr

w80xi6nr1#

一种方法是添加一个新的属性来仅保存DateField并将其用于约束。我认识到这并不能完全满足您的要求,并且需要首先允许空值,转换当前日期时间值的日期字段,但取决于您在此过程中的位置,它可能是可行的。据我所知,唯一性是在数据库级别强制执行的,并且剥离时间的函数可能无法工作。
在unique_together部分中
CREATE TABLE语句中包含相应的UNIQUE语句
附带说明一下,文档建议使用UniqueConstraint作为
请改用UniqueConstraint和约束选项。
UniqueConstraint提供了比unique_together更多的功能。unique_together将来可能会被弃用。

wnavrhmk

wnavrhmk2#

根据文档,字段选项中有一个唯一的_for_date属性。对于任何与同样问题作斗争的人来说,可能值得一试。对于您的示例,它看起来像这样:

class Completion(models.Model):
    date_completed = models.DateTimeField(auto_now=False, auto_now_add=False)
    related_task = models.ForeignKey(Task, unique_for_date='date_completed', on_delete=models.CASCADE)

如果有多个约束,这可能不是最好的选择。

相关问题