Django + postgres auth_user重复键值违反了唯一约束“ auth_user_username_key”

时间:2018-10-16 05:35:39

标签: django postgresql

    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()

以上通过按用户名搜索(如果存在)或通过创建新对象(如果不存在)来获取用户,并更新其属性并将其保存回db。

理想情况下,此代码应处理对象已经存在于数据库中的情况。但这会引发以下错误

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

我不知道原因。在Internet上搜索,发现可能是由于索引已损坏,必须重新设置序列,但找不到确切原因和解决方案。 请帮我解决一下这个。 预先感谢

1 个答案:

答案 0 :(得分:0)

我已经有一段时间了,因为我不掌握Django技能,但到目前为止我还记得你 可以使用另一种方法来解决此问题,例如:

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

如果您的用户名不是pk密钥,则可能必须将其设置为唯一,这样可以防止用户名重复。

Oficial Django reference

但是,您使用self.username变量的方式在我的脑海中浮现出一些东西。似乎您需要一些类来实现这种功能。而且我恐怕您拥有的这种代码和平性位于同一类模型声明中,通过您要执行的查询类型,您应该记住这一点:

如果您要检查尚未在数据库中插入的用户名,则它将没有pk,并且您将无法在数据库中查找此类数据。通过在.save()之前将其召唤,可能会发生某些错误。

希望这对您有所帮助。