Unique_together в Meta vs функция validate_unique в модели
Я хотел бы узнать разницу между этими двумя методами проверки на уникальность.
У меня есть два поля, дубликаты которых я не хочу иметь - имя_ключа и почта разработчика - т.е. разработчик не может иметь два ключа с одинаковым именем. Но два разработчика могут иметь ключ с одинаковым именем друг у друга.
Я узнал об unique_together, поэтому добавил это в KeyDefinitions в models.py:
class Meta:
verbose_name = "Key Definition"
#constraints = [
# models.UniqueConstraint(fields=['key_name', 'developer_email'], name='unique key names for each user')
#]
unique_together = [['key_name', 'developer_email']]
Однако, когда я протестировал это, введя дублирующее имя_ключа и нажав "OK" на моей форме, он просто вернул мне заполненную форму и никаких ошибок. Хотя запись не была добавлена в базу данных, что говорит мне о том, что этот код что-то делает.
Я хотел, чтобы выдавалась ошибка, поэтому я узнал о validate_unique
и добавил ее к той же модели так:
def validate_unique(self, exclude=None):
# I feel like this function makes constraints/unique_together option in Meta obsolete ?!
qs = KeyDefinition.objects.filter(key_name=self.key_name, developer_email=self.developer_email) # need to filter by developer too
print(qs)
if qs:
raise ValidationError (
{'key_name' : ['This Key Name already exists']}
)
return super().validate_unique(exclude)
Приведенный выше код дал мне то, что я хотел - т.е. сообщение об ошибке под полем ввода, если был обнаружен дубликат.
Теперь мой вопрос заключается в следующем - зачем использовать опции constraints/unique_together в классе Meta, если мы можем просто использовать функцию validate_unique, чтобы убедиться, что дубликат не будет отправлен? Это потому, что есть шанс, что кто-то может добавить запись в базу данных вручную? Если да, то почему бы Django не сделать это вместо того, чтобы я переопределял функцию - я просто не знаю, лучший ли это способ справиться с этой ситуацией.