Как сохранить модель в Django с уникальными, но нулевыми полями

Как я могу сохранить модель, которая должна быть уникальной, но при этом допускается null в Django. Например, у меня есть следующая модель...

class PetOwner(models.Model):
    """Model representing a pet owner."""

    user = models.OneToOneField(User, on_delete=models.CASCADE)
    first_name = models.CharField(max_length=50, help_text="Enter owner's first name")
    last_name = models.CharField(max_length=50, help_text="Enter owner's last name")
    email = models.EmailField(
        max_length=50, blank=True, unique=True, help_text="Enter owner's email"
    )
    phone_number = models.CharField(
        max_length=15, blank=True, unique=True, help_text="Enter owner's phone number"
    )
    address = models.ForeignKey(
        "Address", on_delete=models.SET_NULL, null=True, blank=True
    )

Я хочу, чтобы мое приложение работало следующим образом. Пользователь PetOwner может зарегистрироваться, но когда он это делает, он изначально регистрируется только с username, password, паролем подтверждения, first_name и last_name. Я хочу, чтобы у меня была страница профиля, которая позволит обновить PetOwner, чтобы включить их phone_number, но я не хочу делать это обязательным требованием. Я решил, что сделаю phone_number поле null=True и blank=True, но как только я регистрирую второго пользователя, я получаю ошибку django.db.utils.IntegrityError: UNIQUE constraint failed: app_petowner.phone_number. Я полагаю, что это происходит потому, что когда я регистрирую пользователя, по какой-то причине вместо phone_number становится None, даже если я вообще не добавлял номер телефона, он отображается как пустая строка. Не уверен, почему это происходит, и не уверен, как это исправить.

Я думаю, что проблема в том, что вы на самом деле отправляете пустую строку, а не null. Вы должны явно установить номер телефона в None перед сохранением. На самом деле вы можете проверить, является ли это истиной. Просто сделайте так: if phone_number == "": print something

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