Django + postgres значение дублирующего ключа auth_user нарушает уникальное ограничение "auth_user_username_key" - PullRequest
0 голосов
/ 16 октября 2018
    try:
        django_user = User.objects.get(username__iexact=self.username)
    except User.DoesNotExist:
        django_user = User(username=self.username)
    django_user.is_staff=True
    django_user.save()

Выше получает пользователя путем поиска по имени пользователя, если оно присутствует, или создания нового объекта, если он отсутствует, и обновляет его атрибут и сохраняет его обратно в БД.

Этот код в идеале должен обрабатывать ситуацию, когдаОбъект уже присутствует в базе данных.Но это выдает следующую ошибку

duplicate key value violates unique constraint "auth_user_username_key"
DETAIL:  Key (username)=(xxxxxxxx@yyyyy.com) already 
         exists.

Я не понимаю причину этого.Поиск в Интернете и обнаружил, что это может быть из-за повреждения индексов и должен сбросить последовательность, но не может найти точную причину и решение для этого.Пожалуйста, помогите мне с этим.Заранее спасибо

1 Ответ

0 голосов
/ 16 октября 2018

Я давно не обновляю свои навыки Django, но насколько я помню, вы можете использовать другой способ обойти эту проблему, например:

if Entry.objects.filter(username=self.username).exists():
    # DO IF STUFF
else:
    # DO ELSE STUFF

Если ваше имя пользователя неключом pk, тогда вам, возможно, придется установить его как уникальное , и это предотвратит дублирование имен пользователей.

Официальная ссылка на Django

Но естьчто-то, что я думаю о том, как вы используете переменную self.username.Кажется, у вас есть какой-то класс, где вам нужно сделать такую ​​функциональность.И я боюсь, что этот мир кода, который у вас есть, находится в том же объявлении модели класса. В зависимости от типа запроса, который вы хотите выполнить, вам следует помнить следующее:

Если вы хотите проверитькакое-то имя пользователя, которое еще не было вставлено в базу данных, тогда у него не будет pk, и вы не сможете искать такие данные в базе данных.Вызывая его перед .save (), некоторые из этих ошибок могут произойти.

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...