Должен ли я переопределять 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
, то он должен выполняться независимо от того, используется форма или нет.