【问题标题】:Error when updating username via a signal通过信号更新用户名时出错
【发布时间】:2024-01-08 18:29:01
【问题描述】:

我想知道如何更新 Django 用户用户名。我正在使用默认的身份验证模型,与自定义 Profile 的关系为 OneToOneProfile 可以通过最终用户进行更新,并且已经设置了一个信号来监听更改并相应地更新。

即使用户名是乱码或根本没有更改,也会发生相同的错误,所以我不确定为什么违反了唯一约束。

# models

class Profile(models.Model):
    client = models.OneToOneField('auth.User', related_name='profile')


# signals

@receiver(pre_save, sender=Profile, weak=False)
def sync_profile_auth(sender, instance, **kwargs):
    if instance.pk:
        instance.client.first_name = instance.first_name
        instance.client.last_name = instance.last_name
        instance.client.email = instance.email
        instance.client.username = instance.email
        instance.client.save()

# error
django.db.utils.IntegrityError: duplicate key value violates unique constraint "auth_user_username_key"
DETAIL:  Key (username)=(myuser@admin.com) already exists.

干杯。

【问题讨论】:

  • 该错误与您分享给我们的代码无关!您以某种方式尝试使用现有用户名添加用户或更新。
  • @Jamie 当有人尝试将用户名更改为现有用户名时,您会期待什么?
  • @PauloPessoa - 我希望用户名与电子邮件同步更新,除非电子邮件地址已被占用
  • @ozgur - 你是对的,你能把你的评论改成回复回复,这样我就可以更新并关闭了。
  • @JamieStrauss 我认为你对这种情况有很大的问题。

标签: python django django-models django-signals


【解决方案1】:

第一个问题:

也许您正在尝试更新用户,该用户已存在于数据库中。

第二个问题:

username = models.CharField(_('username'), max_length=30, unique=True,
    help_text=_('Required. 30 characters or fewer. Letters, numbers and '
                '@/./+/-/_ characters'),
    validators=[
        validators.RegexValidator(re.compile('^[\w.@+-]+$'), _('Enter a valid username.'), 'invalid')
    ])

变量用户名,有max_length=30。如果用户有超过 30 个字符的电子邮件,则无法注册。

这可能对您有帮助。
Customize User Model

【讨论】:

  • 嗨 Paolo,我有一组自定义迁移,可以修改数据库表以允许更长的用户名。
  • 回到问题,如果您尝试更新对象而不更改用户名会发生什么?你又遇到了关键错误,好吗?