gpt4 book ai didi

python - unique_for_date 的用法

转载 作者:太空宇宙 更新时间:2023-11-04 00:33:36 25 4
gpt4 key购买 nike

我正在尝试使用 unique_for_date 选项来防止在同一日期创建具有相同 slug 的多个帖子。但它似乎根本不起作用:我仍然可以从 shell 和管理仪表板创建具有相同 slug 的帖子。 ModelForm 也是如此。我的模型.py:

class Post(models.Model):

STATUS_CHOICES = (
('draft', 'Draft'),
('published', 'Published'),
('suspended', 'Suspended'),
)

title = models.CharField(max_length=200)
slug = models.SlugField(max_length=200, unique_for_date='created')
status = models.CharField(max_length=15,
choices=STATUS_CHOICES,
default='draft')
content = models.TextField(max_length=200000, blank=True)
# dates
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
publish = models.DateTimeField(default=timezone.now)

我通过更改 auto_now_add=True 找到了某种解决问题的方法至 default=timezone.now但它只在通过 django admin 创建对象时显示错误 - 从 shell 或表单创建对象时仍然没有错误。

更新:我知道使用 auto_now_add 设置 editable=False 会导致 django 跳过字段验证,但它不能解释为什么即使使用 default=timezone.now 也会跳过验证。

更新 2:出于某种原因,unique_for_date 仅适用于 django-admin 仪表板表单(至少在我的情况下)。为了对其他表单获得相同的效果,我重写了模型的 clean_fields 方法(强制 django 验证唯一字段):

def clean_fields(self, exclude=None):
super().clean_fields(exclude=exclude)
self.validate_unique()

最佳答案

我认为您将 created 作为 DateTimeField ,因此它也在考虑时间。尝试将其更改为 DateField

关于python - unique_for_date 的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45000892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com