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 не сделать это вместо того, чтобы я переопределял функцию - я просто не знаю, лучший ли это способ справиться с этой ситуацией.

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