Django:模型(而非表单)级别的验证?

Django:模型(而非表单)级别的验证?,django,validation,django-models,Django,Validation,Django Models,我希望这个失败: MyModelWithSlug.objects.create(name='Foo', slug='abc . ü') 字符串abc。ü在django中不是有效的slug 如何使上述行失败?阅读阿拉斯代尔对OP的评论 Django提供了一个名为的钩子来添加自定义验证,但Django不会在save或create时自动调用它。因此,您还必须在模型上覆盖save()。(感谢@alasdair纠正我的错误。) 因此,模型变成: class MyModelWithSlug(models.

我希望这个失败:

MyModelWithSlug.objects.create(name='Foo', slug='abc . ü')
字符串
abc。ü
在django中不是有效的slug


如何使上述行失败?

阅读阿拉斯代尔对OP的评论

Django提供了一个名为的钩子来添加自定义验证,但Django不会在
save
create
时自动调用它。因此,您还必须在模型上覆盖
save()
。(感谢@alasdair纠正我的错误。)

因此,模型变成:

class MyModelWithSlug(models.Model):
    name = models.CharField(max_length=200, default="")
    slug = models.CharField(max_length=200, null=True, blank=True)

    def clean(self):
        # will raise an Validation Error even if unicode is present. refer validate_unicode_slug
        self.slug = validators.validate_slug(self.slug)

    def save(self):
        self.full_clean() # calls self.clean() as well cleans other fields
         return super(MyModelWithSlug, self).save(*args, **kwargs)
或者更好:


请留下评论,说明为什么这个问题应该被关闭或否决。谢谢。你能把你的模型定义放在你的问题和类似的问题中吗。如果不想手动调用
full\u clean
,可以手动覆盖
save
create
方法,但这可能会导致模型验证两次,或者意外的验证错误导致500个响应。@iklinac我认为模型定义是多余的。这是一个有一个叫做“slug”的字段的模型,这是一个SlugField。这并不能真正回答问题。slug字段表示
instance=MyModelWithSlug(name='Foo',slug='abc.ü');instance.full_clean()
将已经触发验证错误-不需要额外的
clean
方法。OP需要
MyModelWithSlug.objects.create(name='Foo',slug='abc.ü')
来触发相同的验证错误。如果您连接了clean方法,则可以。您实际上不需要调用
instance.full_clean()
。django在
MyModelWithSlug.objects.create(name='Foo',slug='abc.ü')期间调用其模型的
clean
方法
也是。不,Django在
创建期间不调用
clean
@Alasdair,谢谢您的纠正。似乎没有一个干净的函数是自动调用的。相应地编辑了答案。最好打电话而不是
clean
full\u clean
方法验证字段并调用
clean
。由于
full\u clean
验证字段,因此无需在
clean
中手动调用
validate\u slug
class MyModelWithSlug(models.Model):
    name = models.CharField(max_length=200, default="")
    slug = models.SlugField(max_length=200, null=True, blank=True)