Уникальные поля Django ORM

Недавно начал изучать Django, и у меня возникла трудность с моделью. Мне нужно чтобы два поля одной модели не могли совпадать. То есть, у меня есть модель Profiles, где есть поля first_name и last_name. Я хочу чтобы пользователь не мог ввести одинаковые значения для этих двух полей. Единственное что я нашёл это unique и unique_together, которые позволяют сделать уникальными поля разных экземпляров модели. Но никак не влияют на уникальность внутри одного экземпляра. И у меня возникает вопрос, как такое поведение можно было бы реализовать.

Чтоб добавить ограничение на уровне БД, используйте CheckConstraint:

class Profiles(models.Model):
    first_name = models.CharField()
    last_name = models.CharField()

    class Meta:
        constraints = [
            models.CheckConstraint(
                check=~models.Q(first_name=models.F("last_name")),
                name='first_and_last_names_different'),
        ]

Альтернативный вариант проверять перед сохранением в переопределенном методе save или в pre-save сигнале.

Вариант с методом clean в форме также можно использовать, нужно только понимать, что при создании объектов не через форму, такая проверка работать не будет. Так что, в дополнение к проверке в форме (это по сути проверка в UI), нужна обязательно проверка и, как минимум, в модели, а лучше на стороне БД.

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