Должен ли я переопределять clean или validate_unique? В чем разница?

Какая разница, если в models.py у меня было:

def validate_unique(self, exclude=None):
    qs = KeyDefinition.objects.filter(key_name=self.key_name, developer_email=self.developer_email)
    print(qs)
    if qs:
        raise ValidationError (
             {'key_name' : ['This Key Name already exists']} 
        )
    return super().validate_unique(exclude)

vs:

def clean(self):
    qs = KeyDefinition.objects.filter(key_name=self.key_name, developer_email=self.developer_email)
    print(qs)
    if qs:
        raise ValidationError (
             {'key_name' : ['This Key Name already exists']} 
        )

Похоже, они не имеют никакого значения для результата.

В основном, я хочу убедиться, что каждый разработчик не может предоставить ключ с тем же именем, что и тот, который у него уже есть (но два разработчика могут иметь ключ с тем же именем).

Я справился с этим на уровне базы данных, используя опцию unique_together в классе Meta.

Разница в том, что clean - это метод формы и вызывается только при валидации формы. Если вы создаете объект модели без формы, то, очевидно, этот код не будет выполняться. Если же вы используете validate_unique, то он должен выполняться независимо от того, используется форма или нет.

Вернуться на верх